这道题主要注意精度问题就行。
还有就是二分的时候,left=mid+1或者left=mid;都行。
不过个人更喜欢mid+1。
View Code
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #define eps 0.0000000001 5 using namespace std; 6 double n,p; 7 void solve(){ 8 long long right,left,mid; 9 double tmp; 10 left=0; 11 right=1000000002; 12 while(left<=right){ 13 mid=(left+right)/2; 14 tmp=pow(mid,n); 15 if(tmp==p){ 16 printf("%lld\n",mid); 17 return ; 18 } 19 else 20 if(tmp>p) 21 right=mid; 22 else 23 left=mid+1; 24 } 25 return ; 26 } 27 28 int main(){ 29 30 while(scanf("%lf%lf",&n,&p)!=EOF) 31 solve(); 32 //printf("%.0lf\n",ans); 33 return 0; 34 }