清华大学考研复试机试:完数VS盈数

版权声明:本文为博主原创,未经博主允许不得转载。转载请附上原文链接。 https://blog.csdn.net/qq_38341682/article/details/88591999

题目描述

一个数如果恰好等于它的各因子(该数本身除外)子和,如: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;
}

猜你喜欢

转载自blog.csdn.net/qq_38341682/article/details/88591999