题意:
给数x,求最大的整数p,使对某个整数b有x==b^p。
分析:
从大往小枚举p看是否找得到相应的b,当确定p后b==pow(x,1/p),算pow(x,1/p)肯定是会有误差的,解决的办法是将b,b+1,b-1分别带入验算,只要有一个满足我们就找到了相应的b。
代码:
//poj 1730
//sep9
#include <iostream>
#include <cmath>
using namespace std;
__int64 x;
bool flag;
int check(__int64 b,__int64 p)
{
if(b<=1)
return 0;
__int64 sum=1;
if(flag==false){
while(p--)
sum*=(-b);
return sum==-x;
}
else{
while(p--)
sum*=b;
return sum==x;
}
}
int pass(__int64 p){
double b=pow(x*1.0,1.0/p);
__int64 b1=(__int64)(b+1e-9);
__int64 b2=b1-1;
__int64 b3=b1+1;
int ok=0;
if(check(b1,p))
ok=1;
if(check(b2,p))
ok=1;
if(check(b3,p))
ok=1;
return ok;
}
int main()
{
while(scanf("%I64d",&x)==1&&x){
__int64 p;
flag=true;
if(x<0){
flag=false;
x=-x;
}
for(p=32;p>=1;--p)
if(pass(p))
break;
printf("%I64d\n",p);
}
return 0;
}