找出给定数量的最大素数因子的幂

时间:2016-01-31 14:43:50

标签: c++ algorithm prime-factoring

给定数字N,我需要找出一个数字的最大素因子的幂是否大于1。

N可以大到10 ^ 18。我的方法如下:

vector<long long> allfactors;
long long current=2;
while(N>1){
        while(N%current==0){
            allfactors.push_back(current);
            N/=current;
        }
        current++;
        if(current*current > N){
            if(N>1){
                allfactors.push_back(N);
                break;
            }
        }
}
    long long ans=1;
    for(int i=allfactors.size()-2;i>=0;i--){
        if(allfactors[i]!=allfactors[i+1])
            break;
        else
            ans++;
    }
    if(ans>1){
        cout<<"YES\n";
    }
    else{
        cout<<"NO\n";
    }

可以有更好或更快的方法吗?如果有,怎么样?请帮忙。

1 个答案:

答案 0 :(得分:0)

这是我设计的代码。我在projecteuler.net上发现了类似的问题。该数字足以让我使用long long数据类型。希望能帮助到你。 :)

    #include<iostream>
    using namespace std;

    unsigned int next(long long,unsigned int,unsigned int);

    unsigned int store[500];

    int main()
    {
        long long k;
        unsigned int max=1;
        unsigned int j,min=0,i;
        store[0]=2;
        cout<<"\nEnter a number : ";
        cin>>k;
        cout<<"\nPrime factors of the entered number are : \n";
        while(k>1)
        {
            for(i=min;i<max;i++)
            {
                if(k%store[i]==0)
                {
                    k=k/store[i];
                    break;
                }
            }
            if(i==max)
            {
                j=next(k,store[max-1],max);
                store[max]=j;
                min=max;
                max++;

            }
        }
        for(i=0;i<max;i++)
            cout<<"\n"<<i<<" "<<store[i];
        return 0;
    }

    unsigned int next(long long k,unsigned int m,unsigned int max)
    {
        long long i,j;
        int flag=0;
        for(i=m+1;i<=k;i++)
        {
            flag=0;
            for(j=0;j<max;j++)
            {
                if(i%store[j]==0)
                {
                    flag=1;
                    break;
                }
            }
            if(flag==0 && k%i==0)
                break;
        }
        return i;
    }