题目描述
一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。
输入描述
题目没有任何输入。
输出描述
输出2到60之间所有“完数”和“盈数”,并以如下形式输出:
E: e1 e2 e3 …(ei为完数)
G: g1 g2 g3 …(gi为盈数)
其中两个数之间要有空格,行尾不加空格。
分析
因为数据量很小,60以内,所以可以暴力求解,求因子的时候也可以直接遍历,不需要优化。对于输出格式的要求,在输出第一个数的时候不加空格,后面输出的数都在其前面加上空格即可。
AC代码如下:
#include<iostream>
#include<vector>
using namespace std;
int func(int num)//求因子之和
{
int result = 1;//1也是因子
for(int i = 2; i < num; ++i)
{
if(num%i == 0)
{
result += i;
}
}
return result;
}
int main(void)
{
vector<int> wan, ying;
for(int i = 5; i <= 60; ++i)//5之前的数既不是完数,也不是盈数
{
if(func(i) == i)//完数
{
wan.push_back(i);
}
else if(func(i) > i)//盈数
{
ying.push_back(i);
}
}
//输出格式要求
cout << "E: " << wan[0];
for(int i = 1; i < wan.size(); ++i)
{
cout << " " << wan[i];
}
cout << endl;
cout << "G: " << ying[0];
for(int i = 1; i < ying.size(); ++i)
{
cout << " " << ying[i];
}
return 0;
}