326. Power of Three(C++)

来源:互联网 发布:linux 查看登陆信息 编辑:程序博客网 时间:2024/06/04 18:32

题目:

Given an integer, write a function to determine if it is a power of three.
给一个整数,判断它是不是3的幂数
Follow up:
Could you do it without using any loop / recursion?
不用循环或递归写出这个方法

解答:

最简单的:
用循环/注意判断0特殊值

class Solution {public:    bool isPowerOfThree(int n) {    if(n==0)return false;    while(n%3==0)n/=3;    return n==1;}};

思考:不用循环或递归:如果想一下子做出来的话,可以翻转想法,不要总想着用这个数除以3(或者利用各个位子上的数求和除以三余0就是三的倍数),因为总要除好多个三,想想三的幂数的特点:往大处想,3的n次幂一定是3的k次幂的因子(k>n),而且3的k次幂只有3这一个质因子,那么判断一个数是否是三的幂数只要用一个很大的(3的k次方(k很大))数除以这个数,如果余数为零就正确。因为题目给出的n使int类型,那么只要找到大于等于int边界那个数(3^k)就好了。这个数需要测试出来(只需要写一个小程序试一试)
我的执杖测试程序:

#include<iostream>using namespace std;int main(){    int n,k=1;    cin>>n;    for(int i=0;i<n;i++){        k=k*3;    }    cout<<k;    return 0;}

(初始试的时候因为int边界是2^31,我就没什么根据的试了个3^20 (31*(2/3)),于是很快就锁定了19)
得到当幂数为19是临界值为1162261467。(输入20会产生溢出得到一个负值)
于是就可以欢快的写方法了:

bool isPowerOfThree(int n) {    if(n<=0)return false;    return 1162261467%n==0;}

//注意小于0的情况,第一个方法可行是因为负数的话会输出-1,但这个是不会,负数是不符合条件的。

0 0
原创粉丝点击