题目描述:
一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1,则称其为“完数”;
若因子之和大于该数,则称其为“盈数”。求出2 到60 之间所有“完数”和“盈数”,并以如
下形式输出: E: e1 e2 e3 …(ei 为完数) G: g1 g2 g3 …(gi 为盈数)
输入:
无
输出:
按描述要求输出(注意EG后面的冒号之后有一个空格)。
实现代码:
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;
int perfect_num(int n){
int a=sqrt(1.0*n);
int sum=0;
for(int i=1;i<=a;i++){
if(n%i==0){
if(i==n/i){
sum+=i;
}else{
sum+=(i+n/i);
}
}
}
if(sum>2*n){
return 1;
}else if(sum==2*n){
return 0;
}else{
return -1;
}
}
int main()
{
int a[60];
int b[60];
int num1=0;
int num2=0;
for(int i=2;i<=60;i++){
if(perfect_num(i)==1){
a[num1++]=i;
}
if(perfect_num(i)==0){
b[num2++]=i;
}
}
printf("E:");
for(int i=0;i<num2;i++){
printf(" %d",b[i]);
}
printf(" ");
printf("G:");
for(int i=0;i<num1;i++){
printf(" %d",a[i]);
}
return 0;
}