We say that x is a perfect square if, for some integer b, x = b 2. Similarly, x is a perfect cube if, for some integer b, x = b 3. More generally, x is a perfect pth power if, for some integer b, x = b p. Given an integer x you are to determine the largest p such that x is a perfect p th power.
Input
Each test case is given by a line of input containing x. The value of x will have magnitude at least 2 and be within the range of a (32-bit) int in C, C++, and Java. A line containing 0 follows the last test case.
Output
For each test case, output a line giving the largest integer p such that x is a perfect p th power.
Sample Input
17 1073741824 25 0
Sample Output
1 30 2
给个n,把它表示成a^b的形式,问b最大是多少,n有负数
正数简单,负数要打个标记,最后答案b要除到没有2的因子为止
比如-1073741824=-(2^30)=(-4)^15,但是不能是(-2)^30
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 #define LL long long 5 inline LL read() 6 { 7 LL x=0,f=1;char ch=getchar(); 8 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 9 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 10 return x*f; 11 } 12 LL n; 13 bool mk[100010]; 14 int p[100010],len; 15 inline LL LLabs(LL a){return a<0?-a:a;} 16 inline void getp() 17 { 18 for (int i=2;i<=100000;i++) 19 { 20 if (!mk[i]) 21 { 22 p[++len]=i; 23 for (int j=2*i;j<=100000;j+=i)mk[j]=1; 24 } 25 } 26 } 27 inline void work() 28 { 29 int flag=(n<0),ans=0;n=LLabs(n); 30 for (int i=1;i<=len;i++) 31 { 32 if ((LL)p[i]*p[i]>n)break; 33 if (n%p[i]!=0)continue; 34 int now=0;while (n%p[i]==0)n/=p[i],now++; 35 if (!ans)ans=now;else ans=__gcd(ans,now); 36 } 37 if (n!=1)ans=1; 38 if (flag)while (ans%2==0)ans/=2; 39 printf("%d\n",ans); 40 } 41 int main() 42 { 43 getp(); 44 while (~scanf("%lld",&n)&&n)work(); 45 }
——by zhber,转载请注明来源