leecode 解题总结:326. Power of Three

来源:互联网 发布:arcgis js heatmap 编辑:程序博客网 时间:2024/06/07 16:05
#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=000000013^1=3=000000113^2=9=000010013^3=27=000110113^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输入:12381输出:truefalsetruetrue关键:1 参考解法http://blog.csdn.net/ebowtang/article/details/50485622采用log函数,3^n以3为底数的log值是整数,但是要用log10(n) / log(3)不会带来精度问题,然后比较double和转化为int的结果相减是否为02 还可以枚举出所有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;}

0 0
原创粉丝点击