#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
/*
问题:
Given an integer, write a function to determine if it is a power of three.
Follow up:
Could you do it without using any loop / recursion?
分析:给定一颗整数,判断它是否是3的次方。
尽量不要使用循环或者递归。
3^0 = 1 = 00000001
3^1 = 3 = 00000011
3^2 = 9 = 00001001
3^3 = 27 = 00011011
3^4 = 81 = 01010001
分析这个有什么特点
我们知道2^n的特点是只有一位上面是1。因此可以用n&(n-1)来判定
3^n=(2+1)^n=2^0 * 1^n + C(n,1)2^1 * 1^(n-1) + ... + C(n,n)2^n * 1^0
=C(n,0)2^0 + C(n,1)2^1 + ... + C(n,n)2^n
因为(a+b)^n=C(n,k)*a^k * b^(n-k),然后k属于0到n
这个公式比较复杂。
如果要循环:每次除以3看是否能够除尽。递归和循环一个处理方式。
不能使用,要么做减法,要么做加法。没有想到
参考解法http://blog.csdn.net/ebowtang/article/details/50485622
采用log函数,3^n以3为底数的log值是整数,但是要用log10(n) / log(3)
不会带来精度问题,然后比较double和转化为int的结果相减是否为0
输入:
1
2
3
81
输出:
true
false
true
true
关键:
1 参考解法http://blog.csdn.net/ebowtang/article/details/50485622
采用log函数,3^n以3为底数的log值是整数,但是要用log10(n) / log(3)
不会带来精度问题,然后比较double和转化为int的结果相减是否为0
2 还可以枚举出所有3^n次方,或者用不超过int的3^n的最大值除以给定数余数为0即可
*/
class Solution {
public:
bool isPowerOfThree(int n) {
double result = log10(n) / log10(3);
return (result - int(result)) == 0 ? true : false;
}
};
void process()
{
int num;
Solution solution;
while(cin >> num )
{
bool result = solution.isPowerOfThree(num);
if(result)
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}