数论,判断整数N的正约数之和和N之间的大小关系,
先素数分解,然后用欧拉函数的一个变形就可以搞定了。
注意输出的时候的格式要求,用setw
/*
time: 0MS
result:AC
*/
#include"iostream"
#include"math.h"
#include"iomanip"
using namespace std;
bool isprime[100];
int prime[100];
int k=0;
struct p{
double x;
double i;
};
void getprime(){
int i=2,j;
for(i;i<100;i++){
if(!isprime[i])
prime[k++]=i;
for(j=i+i;j<100;j+=i)
isprime[j]=true;
}
}
int main()
{
int n;
p s[100]={0};
getprime();
//cout<<""<<endl;
int ll=0;
while(cin>>n,n){
int tmp,j,t=0;
int nn=n;
ll++;
if(ll==1)
cout<<"PERFECTION OUTPUT"<<endl;
for(j=0;j<k;j++)
{
tmp=0;
if(n%prime[j]==0)
while(n%prime[j]==0){
n/=prime[j];
tmp++;
}
s[t].x=prime[j];
s[t++].i=tmp;
if(n==1)
break;
}
if(n!=1){
s[t].x=n;
s[t++].i=1;
}
double sum=1;
for(j=0;j<t;j++)
sum*=(pow(s[j].x,s[j].i+1)-1)/(s[j].x-1);
sum-=nn;
if(sum<nn)
cout<<setw(5)<<nn<<" DEFICIENT"<<endl;
else if(sum==nn)
cout<<setw(5)<<nn<<" PERFECT"<<endl;
else
cout<<setw(5)<<nn<<" ABUNDANT"<<endl;
}
cout<<"END OF OUTPUT"<<endl;
return 0;
}