完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。
给定函数count(int n),用于计算n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
返回n以内完全数的个数。 异常情况返回-1
方法一:遍历,为了降低复杂度,进行开平方
#include<iostream>
#include<algorithm>
using namespace std;
bool judge(int n){
int total=0;
for(int i=1;i<=sqrt(n);i++)
{
if(n%i==0)
total=total+i+n/i;
}
total=total-n;
if(int(sqrt(n))*int(sqrt(n))==n)
{
total=total-sqrt(n);
}
if(int(total)==n)
{
return 1;
}else{return 0;}
}
int main(){
int n;
while(cin>>n){
int count=0;
if(n>500000||n<0)
cout<<"-1"<<endl;
else{
for(int i=1;i<=n;i++)
if(judge(i))
count++;
cout<<count<<endl;
}
}
return 0;
}
方法2:规律法
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
int n;
while(cin >> n)
{
int out = 4;
if(n < 6) out = 0;
else if(n < 28) out = 1;
else if(n < 496) out = 2;
else if(n < 8128) out = 3;
cout << out << endl;
}
return 0;
}