这个有2种方法。
一种是通过枚举p的值(p的范围是从1-32),这样不会超时,再就是注意下精度用1e-8就可以了,还有要注意负数的处理……
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<cmath> 5 #include<iomanip> 6 #include<string> 7 using namespace std; 8 int fun(double n) 9 { 10 int p=32,f=1; 11 if(n<0) 12 { 13 p=31; 14 f=2; 15 n=-n; 16 } 17 for(;p>=1;p-=f) 18 { 19 double a=pow(n,1.0/p); 20 long t1=a; 21 long t2=a+1; 22 if(a-t1<=1e-12||t2-a<=1e-12) 23 break; 24 } 25 return p; 26 } 27 int main() 28 { 29 int x,p; 30 while(cin>>x&&x) 31 { 32 p=fun(x); 33 cout<<p<<endl; 34 } 35 return 0; 36 }
第二种方法就是分解素数因子,求出因子的指数的最大公约数就是答案了,但是我这测试没错,提交超时……
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<vector> 5 #include<cmath> 6 #include<iomanip> 7 #include<string> 8 using namespace std; 9 int prime[100001],a[100001]; 10 void init() 11 { 12 int i,j,k=0; 13 for(i=2;i<=100000;i++) 14 { 15 if(!a[i]) 16 { 17 prime[k++]=i; 18 for(j=i+i;j<=100000;j+=i) 19 a[j]=1; 20 } 21 } 22 } 23 int gcd(int a,int b) 24 { 25 int c; 26 if(a<b) swap(a,b); 27 while(b) 28 { 29 c=a; 30 a=b; 31 b=c%b; 32 } 33 return a; 34 } 35 int main() 36 { 37 int n,i,j; 38 bool flag; 39 init(); 40 while(scanf("%d",&n),n) 41 { 42 flag=0; 43 if(n<0) 44 { 45 flag=1; 46 n=-n; 47 } 48 vector<int> key; 49 for(i=0;prime[i]*prime[i]<=n;i++) 50 { 51 if(n%prime[i]==0) 52 { 53 int c=0; 54 for(;n%prime[i]==0;n/=prime[i],c++); 55 key.push_back(c); 56 } 57 } 58 if(n>1) key.push_back(1); 59 int sum=key[0]; 60 for(i=1;i<key.size();i++) 61 sum=gcd(sum,key[i]); 62 if(flag) 63 { 64 while(sum%2==0) 65 sum/=2; 66 } 67 printf("%d ",sum); 68 } 69 return 0; 70 }