3778 - 【START】2015暑期训练——完数

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

自然数中,完数寥若晨星,请在从1到某个整数范围中打印出所有的完数来。所谓“完数”是指一个数恰好等于它的所有不同因子之和(不包括它本身)。例如,6是完数,因为6=1+2+3。而24不是完数,因为24≠1+2+3+4+6+8+12(=36)。

题目输入

输入数据中含有一些整数(1<n<100000)

题目输出

对于每个整数n,输出所有不大于n的完数。每个整数n的输出由n引导,跟上冒号,然后是由空格分隔的一个个完数,每个n的完数列表应占独立的一行。如果1~n不存在完数,则只需输出n:,并以换行符结束。

输入/输出样例

输入格式

100
200

输出格式

100: 6 28
200: 6 28

C语言解答

#include<stdio.h>
int iswanshu(int n)
{
	int s = 1,i;
	if(n%2)
	return 0; 
	for(i = 2;i * i <= n;i++)
	{
		if(n%i)
		continue;
		else
		s += (i + n/i);
	}
	if(s == n)
	return 1;
	else
	return 0;
}
int main()
{
	int n,i;
	while((scanf("%d",&n))!=EOF)
	{
		if(n < 6)
		break;
		else
		printf("%d:",n);
		for(i = 2;i <= n;i++)
		if(iswanshu(i))
		printf(" %d",i);
		printf("\n"); 
	}
	return 0;
}

C++解答

#include<fstream>
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	//ifstream cin("1.txt");
	//ofstream cout("2.txt");
	
	vector<int> a;
	// 求出所有完数 
	// 10000 - 100000之间不存在完数 
	for(int i = 2; i < 10000; i += 2) {
		int sum = 1;
		for(int j = 2; j <= i/2; j++) {
			if(i%j == 0) sum = sum + j;
		}
		if(sum == i) a.push_back(i);
	}
	
	int n;
	while(cin >> n) {
		cout << n << ":";
		for(int i = 0; i < a.size(); i++) {
			if(a[i] <= n) cout << " " << a[i];
		}
		cout << endl;
	} 
	 
	
	return 0;
}