#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
class Integer
{
private:
long num;
vector<int>divisor; //num的真约数放在向量divisor中
public:
Integer(long n=0):num(n)
{
}
int Sum(long n); //求整数各个位的数的累加和
inline int individul(long n) //求n的个位上的数
{
return n%10;
}
bool IsPrime(long n); //判断n是不是素数
void Realdivisor();
bool IsPerfect();
void showRealdivisor(); //显示向量divisor中的内容
};
bool Integer::IsPrime(long n)
{
int i;
for(i=2;i<=static_cast<int>(sqrt(n));i++)
{
if(n%i==0) return false;
}
return true;
}
int Integer::Sum(long n)
{
int s=0;
while(n)
{
s+=n%10;
n/=10;
}
return s;
}
void Integer::Realdivisor()
{
int i;
for(i=num/2;i>=1;i--) //n的最大真约数不会超过n/2
{
if(num%i==0) this->divisor.push_back(i);
}
}
void Integer::showRealdivisor()
{
cout<<num<<"的真约数是:";
vector<int>::const_iterator it;
for(it=this->divisor.begin();it!=this->divisor.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
bool Integer::IsPerfect()
{
vector<int>::const_iterator it;
long s=0;
for(it=this->divisor.begin();it!=this->divisor.end();it++)
{
s+=*it;
}
if(s-num==0) return true;
else return false;
}
void main()
{
long num;
cout<<"请输入一个整数:";
cin>>num;
if(!cin.good())
{
cerr<<"输入数据错误!"<<endl;
return;
}
Integer integer(num);
integer.Realdivisor();
integer.showRealdivisor();
if(integer.IsPerfect())
{
cout<<num<<"是完美数!"<<endl;
}
else cout<<num<<"不是完美数!"<<endl;
}