Description
如果一个数x可以被表示成b^p的形式,则称其为一个完美p次方数,先给出x,求最大p使得x是一个完美p次方数
Input
多组输入,每组一个整数x,以x=0结束输入
Output
对于每组输入,输出最大的p使得x是一个完美p次方数
Sample Input
17
1073741824
25
0
Sample Output
1
30
2
Solution
将x素分解后找其素因子幂级数的最大公约数ans即可,注意当x为负的时候需要将得到的ans值一直除以2至其变成奇数,因为b的偶数次方不可能为负数
Code
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 66666
typedef long long ll;
bool is_prime[maxn];
int prime[maxn];
int cnt;
void get_prime()
{
memset(is_prime,true,sizeof(is_prime));
cnt=1;
for(int i=2;i<maxn;i++)
if(is_prime[i])
{
prime[cnt++]=i;
for(int j=i;j<maxn;j+=i)
is_prime[j]=false;
}
}
int gcd(int x,int y)
{
if(x<y) return gcd(y,x);
if(y==0) return x;
return gcd(y,x%y);
}
int main()
{
ll n;
get_prime();//打素数表
while(scanf("%lld",&n),n)
{
int flag=0;
if(n<0)//如果n是负数,标记后对其取绝对值以便后面的素因子分解
n=-n,flag=1;
int ans=0,res=0;
while(n>1&&res<cnt-1)//对n素分解
{
int num=0;
res++;
while(n%prime[res]==0)
{
n/=prime[res];
num++;
}
ans=gcd(ans,num);
}
if(n!=1) ans=1;//n仍然不为1说明此时n是一个素数,且其幂级数为1,故ans也为1
if(flag)//如果n是负数则需将ans变为奇数
while(ans%2==0)
ans/=2;
printf("%d\n",ans);
}
return 0;
}