UVA 10622(完全P次方数)。

要考虑负数,还要考虑超时,改了三四遍才过......

其实就是暴力,稍微处理一下就不会超时了。

 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 }

 

posted @ 2017-01-13 22:39  萧萧Hsiao  阅读(272)  评论(0编辑  收藏  举报