完全数

自己写了一个完全数的程序

#include<iostream>
#include<cmath>
using namespace std;
long long n;
int prime[100],pNum;
int fx[100],fnum[100];
int cnt;
bool isPrime(int n)
{
    if(n<=1) return false;
    int sqr=(int)sqrt(n*1.0);
    for(int i=2;i<=sqr;i++) if(n%i==0) return false;
    return true;
}
int main()
{
    cin>>n;
    
    long long  s=1;
    //生成一个素数数组 
    for(int i=2;s<n;i++)
    {
        if(isPrime(i)) prime[pNum++]=i,s*=i; 
    }
    
    //cout<<pNum<<endl;
    
    for(int i=2;i<=n;i++)//枚举1-n 
    {
        int num=0;
        int nn = i; //保存n的值 
        int sqr = (int)sqrt(nn*1.0); 
        for(int j=0;j<pNum && prime[j]<=sqr;j++)
        {
            if(nn%prime[j]==0)
            {
                fx[num]=prime[j];
                fnum[num]=0;
                while(nn%prime[j]==0)
                {
                    fnum[num]++;
                    nn/=prime[j];
                }
                num++;
            }
        }
        if(nn!=1)
        {
            fx[num]=nn;
            fnum[num]=1;
            num++;
        }
    
        s = 1;
        long long sum,temp;
        for(int j=0;j<num;j++)
        {
            sum = 0,temp = 1;
            for(int k=0;k<=fnum[j];k++)
            {
                sum+=temp;
                temp*=fx[j];
            }    
            s*=sum;
        }
        /*
        cout <<"test n = "<< i << " " << " s = "<<  s << endl;
        for(int j=0;j<num;j++) cout << fx[j] << " ";
        cout << endl;
        for(int j=0;j<num;j++) cout << fnum[j]<<" ";
        cout << endl; 
        */
        if(s-i==i) cnt++;
    } 
    cout << cnt;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zuimeiyujianni/p/9288442.html