uva10622

题目连接:UVA - 10622 

 1 #include<cstdio>
 2 #include<cstring>
 3 long long x;
 4 int cnt;
 5 int pri[50100];
 6 int vis[50100];
 7 void is_pri()      //预处理素数表
 8 {
 9     memset(vis,0,sizeof(vis));
10     cnt=0;
11     for(int i=2;i<300;i++) if(!vis[i])
12         for(int j=i*i;j<50100;j+=i)
13             vis[j]=1;
14     for(int i=2;i<50100;i++) if(!vis[i])
15         pri[cnt++]=i;
16 }
17 int gcd(int x,int y)
18 {
19     return y==0?x:gcd(y,x%y);
20 }
21 int maxp(long long x)   //利用唯一分解定理
22 {
23     long long y=x;
24     x=x<0?-x:x;
25     int tmp;
26     int ans=0;
27     for(int i=0;i<cnt&&pri[i]<=x;i++)
28     {
29         tmp=0;
30         while(x%pri[i]==0) {tmp++;x/=pri[i];}
31         ans=gcd(ans,tmp);  //求指数的最大公因数
32     }
33     if(ans==0) return 1;
34     if(y<0) while(ans%2==0) ans/=2;
35     return ans;
36 
37 }
38 int main()
39 {
40     is_pri();
41    // for(int i=0;i<cnt;i++) printf("%d ",pri[i]);
42     while(scanf("%lld",&x)&&x)
43     {
44         printf("%d
",maxp(x));
45 
46     }
47 }
原文地址:https://www.cnblogs.com/yijiull/p/6808980.html