POJ 1730 Perfect Pth Powers(数论)

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;
}

你可能感兴趣的:(POJ 1730 Perfect Pth Powers(数论))