0%

NowCoder-完数和盈数

Problem

一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。

没有输入

Solutions

  • 暴力求解

C++ Codes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>
#include<cmath>
using namespace std;

int getSum(int n){
int sq = sqrt(n);
int res = 1;
for(int i=2;i<=sq;i++){
if(n%i==0){
res = res+i+n/i;
if(i*i==n) res-=i;
}
}
return res;
}

int main(){
int p[60], q[60];
int cntp=0, cntq=0;
for(int i=2;i<=60;i++){
int tmp = getSum(i);
if(tmp==i){
p[cntp++]=i;
}else if(tmp>i){
q[cntq++]=i;
}
}
cout<<"E:";
for(int i=0;i<cntp;i++) cout<<" "<<p[i];
cout<<"\nG:";
for(int i=0;i<cntq;i++) cout<<" "<<q[i];
return 0;
}