leetcode: power of three 三种解法

cyang Lv6

一、题目

leetcode 上有这么一道题,power of three.

题目如下:

Given an integer, write a function to determine if it is a power of three.

要求:

Could you do it without using any loop / recursion?

就是说给出一个数,判断该数是否是 3 的 n 次方。且最好不要使用循环或者迭代来实现。

二、解法:

1、方法一、

使用最基本的循环判断,通过循环判断目标值是否可以对 3 进行整除。代码如下:

1
2
3
4
5
6
7
8
9
10
while(n)
{
if(n==1)return true;
if(n%3 != 0)
return false;
n /= 3;
if(n == 1)
return true;
}
return false;

2、方法二、

由于在 int(4字节)的范围内,3 最大的一个次方数为 3^19,即 1162261467,可用该数值对目标值进行取余操作,如果余数为 0,则说明目标值是一个 3 的某次方数。代码如下:

1
2
3
4
5
if(n <= 0)return false;
if(1162261467%n == 0)
return true;
else
return false;

3、方法三

通过对目标值取 3 的对数,判断该值是否为整数来判断。利用换底公式,log3(n) = log10(n) / log10(3)。利用a-(int)a == 0 来判断 a 是否为整数。代码如下:

1
2
3
4
5
6
double res;
res = log10(n)/log10(3);
if(res- (int)res == 0)
return true;
else
return false;

三种解法的代码在 leetcode 网站的运行时间如下图:

  • 1、方法一
    这里写图片描述
  • 2、方法二
    这里写图片描述
  • 3、方法三
    这里写图片描述

可见,第二种最好,第一种次之,第三种最差。
类似的题目还有 power of two, power of four,使用上述三种方法略加修改即可。但是在题目 power of four 时,由于 4 本身是 2 的平方,所以第二种方法会失效。这是因为 2^奇数次方 != 4 的 n 次方。所以需要加入限制条件,代码如下:

1
2
3
4
5
6
7
8
9
10
if(n <= 0)return false;
if(4294967296%n == 0)
{
if((int)(log10(n)/log10(2)) % 2 == 0)
return true;
else
return false;
}
else
return false;

三、附录

全部代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
*326. Power of Three
* three ways to solution this problem
*/

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

#define solution 3

bool isPowerOfThree(int n) {

#if solution==1
//循环迭代
while(n)
{
if(n==1)return true;
if(n%3 != 0)
return false;
n /= 3;
if(n == 1)
return true;
}
return false;
#elif solution==2
//32位数中最大的3次方数
if(n <= 0)return false;
if(1162261467%n == 0)
return true;
else
return false;
#elif solution==3
//对数换底公式
//使用 a-(int)a == 0; 来判断a是否为整数
double res;
res = log10(n)/log10(3);
if(res- (int)res == 0)
return true;
else
return false;
#endif
}

int main()
{
int num = 4782968;
bool res = false;

res = isPowerOfThree(num);
printf("res = %d\n",res);

return 0;
}

原文链接:本人CSDN博客

  • 标题: leetcode: power of three 三种解法
  • 作者: cyang
  • 创建于 : 2017-08-01 22:16:39
  • 更新于 : 2020-02-19 21:32:46
  • 链接: https://blog.cyang.tech/2017/08/01/leetcode: power of three 三种解法/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论