要考虑负数,还要考虑超时,改了三四遍才过......
其实就是暴力,稍微处理一下就不会超时了。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstdlib> 5 #include <cmath> 6 7 using namespace std; 8 const double eps = 0.001; //用于浮点数精度控制 9 int Cal(int n) 10 { 11 int i,j; 12 for(i=30; i>=2; i--) 13 { 14 if(pow(2,i) < n+eps)//不加会超时! 15 for(j=2; j*j<=n; j++) 16 { 17 double t = pow(j,i); 18 if(t > n-eps &&t < n+eps) 19 return i; 20 if(t > n+eps)//不加会超时,下个函数一样! 21 break; 22 } 23 } 24 return 1; 25 26 } 27 int Cal2(int n) 28 { 29 int i,j; 30 for(i=31; i>=3; i-=2)//偶数次方只可能是正数 31 { 32 if(pow(2,i) - eps < (double)(-n)) 33 for(j=2; j*j<=-n; j++) 34 { 35 double t = pow(j,i); 36 if(t > -n-eps &&t < -n+eps) 37 return i; 38 if(t > -n+eps) 39 break; 40 } 41 } 42 return 1; 43 } 44 int main() 45 { 46 int n,i; 47 while(scanf("%d",&n) && n) 48 { 49 if(n==-2147483648) //最小的int型数,防止越界就提出来特殊判断一下。 50 { 51 printf("31\n"); 52 continue; 53 } 54 if(n>0) 55 printf("%d\n",Cal(n)); 56 else 57 printf("%d\n",Cal2(n)); 58 } 59 return 0; 60 }
原文:http://www.cnblogs.com/HsiaoYeekwan/p/6284310.html