leecode 解题总结:326. Power of Three

该篇博客介绍了一个解题思路,针对给定整数判断其是否为3的幂。通过使用log函数,计算以3为底数的对数,然后判断结果是否为整数,从而确定该数是否为3的次幂。博客提供了C++实现代码,并讨论了避免使用循环和递归的方法。
摘要由CSDN通过智能技术生成
#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值