这是一个问题: 给定适合32位有符号整数的正整数,找出它是否可以表示为A ^ P,其中P> 1。 1和A> 0. A和P都应该是整数。
我知道我可以用蛮力方法解决它;但是,我想知道我是否能以更好的方式解决它,还是可以使用递归技术解决它? 谢谢你的帮助!
答案 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/2
,1/3
,1/4
等的分数幂,直到{{1 }}。结果将是1/log2 n
;分数的分母为A
。
由于权力计算在P
s,您需要同时尝试结果的double
和ceil
。一旦你没有找到结果就达到零,算法就会停止。
答案 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)
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;
}