当前位置: 代码迷 >> 综合 >> poj 1730 Perfect Pth Powers 精度修正
  详细解决方案

poj 1730 Perfect Pth Powers 精度修正

热度:3   发布时间:2024-01-19 06:17:20.0

题意:

给数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;	
} 


  相关解决方案