[InterviewBit]两个整数的力量

时间:2016-08-11 11:33:14

标签: algorithm recursion

这是一个问题: 给定适合32位有符号整数的正整数,找出它是否可以表示为A ^ P,其中P> 1。 1和A> 0. A和P都应该是整数。

我知道我可以用蛮力方法解决它;但是,我想知道我是否能以更好的方式解决它,还是可以使用递归技术解决它? 谢谢你的帮助!

7 个答案:

答案 0 :(得分:3)

这也可以通过这种方式解决。

public boolean isPower(int a) {
    if (a == 1) return true;
    for (int idx = 2; idx * idx <= a; idx ++) {
        double val = Math.log (a)/Math.log (idx);
        if ((val - (int) val) < 0.00000001) return true;
    }
    return false;
}

答案 1 :(得分:1)

一种方法是转换为double,并使用数学来获得1/21/31/4等的分数幂,直到{{1 }}。结果将是1/log2 n;分数的分母为A

由于权力计算在P s,您需要同时尝试结果的doubleceil。一旦你没有找到结果就达到零,算法就会停止。

答案 2 :(得分:0)

基于@xenteros答案并成功提交的代码。

public static int isPower(int A) {
        if(A == 1)
            return 1;
        double Ad = A ;
       for(int i =2;i<=(Math.log(Ad)/Math.log(2));i++)
       {
           double a = Math.pow(Ad,(double)1/i);
           if(Math.ceil(a) == Math.floor(a) || Math.ceil(a)-a <0.000000001)
                return 1;
       }
       return 0;
    }

答案 3 :(得分:0)

while(test--)
{
    int input;
  cin>>input;

  if(input<=2)
  {cout<<"0"<<endl;
  break;}
  //cout<<m;
  int m=sqrt(input);
  int count=2;
  int flag=0;
while(count<=m+1)
{
    if(ceil(log2 (input)/log2 (count))== floor(log2 (input)/log2 (count)))
    {
       // cout<<"ghusa   "<<count<<"  "<<input;
        flag=1;
        cout<<"1";
        break;
    }
    count++;
}
if(flag==0)
{cout<<"0";

}
cout<<endl;  
}

return 0;

}

答案 4 :(得分:0)

bool ans(long long int n)
{
    if(n==1)
        return true;
    else
    {
        for (long long int i = 2; i*i <= n; i++)
        {
            if(ceil(log2 (n)/log2 (i)) == floor(log2 (n)/log2 (i)))
            {
                return true;
            }
        }
    }

    return false;
}

答案 5 :(得分:-1)

让我们调用初始整数N。

首先,你必须得到N的所有主要除数。

如果N只有1个除数,那么它的形式为D ^ k,所以它是真的。

如果它有超过1个除数,你应该检查每个除数的gcd是否与1不同并且是偶数。

例如:

12 = 2 * 2 * 3
not possible, GCD(2,1) = 1

24 = 2 * 2 * 2 * 3
not possible, GCD(3,1) = 1

36 = 2 * 2 * 3 * 3
possible,     GCD(2,2) = 2

144 = 2 * 2 * 2 * 2 * 3 * 3
possible,     GCD(4,2) = 2

120 = 2 * 2 * 2 * 3 * 5
not possible, GCD(1,1,3) = 1

216 = 2 * 2 * 2 * 3 * 3 * 3
not possible, GCD(3,3) = 3

答案 6 :(得分:-1)

  1. 我们将检查a == 1然后它可以表示为x ^ 0因此 是的。对于&gt; 1我们将检查2或3或4 .... a;我们会 除p(p = a)如果p%2或,3或,4或.......如果(p == 1)表示p是 完全被2,或3或4整除......是指p (其中p = a)我们可以写成x ^ y。因此返回真实。
  2.  public boolean isPower(int a) {
           if(a==1) return true;
             for (int i = 2; i*i <= a; i++) {
                  int p = a;
                  while(p%i == 0){
                    p/=i;
                  }
                  if(p == 1) return true;
             }
             return false;
    
      }