枚举和模拟 下 习题
06 完数VS盈数
描述
一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。
输入描述
题目没有任何输入。
输出描述
输出2到60之间所有“完数”和“盈数”,并以如下形式输出: E: e1 e2 e3 …(ei为完数) G: g1 g2 g3 …(gi为盈数) 其中两个数之间要有空格,行尾不加空格。
解答
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
using namespace std;
//提取因子和求和 单独写成一个函数
int FactorSum(int i) {
int res = 0;
for (int j = 1; j < i; j++) {
//能够整除为0 说明是因子
if (i % j == 0) {
res = res + j;
}
}
return res;//返回因子之和
}
int main() {
vector<int> Evec;//保存完数
vector<int> Gvec;//保存盈数
//找出符合要求的数字 放入动态数组
for (int i = 2; i <= 60; i++) {
if (i == FactorSum(i)) {
//说明是完数 放入第一个动态数组
Evec.push_back(i);
}
else if (i < FactorSum(i)) {
Gvec.push_back(i);
}
}
//输出两个动态数组
vector<int>::iterator it;
printf("E:");
for (it = Evec.begin(); it != Evec.end(); it++) {
printf(" %d", *it);
}
printf("\n");
printf("G:");
for (it = Gvec.begin(); it != Gvec.end(); it++) {
printf(" %d", *it);
}
printf("\n");
return 0;
}