加载中...

浙江理工大学入队200题——15G

问题 G: 零基础学C/C++167——判断是否完数

题目描述

编写一个判断一个数是否是完数的函数,用main()函数调用。并求n—m以内的完数有哪些?
一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。

输入

输入为多组测试数据。
输入n和m( 1 <= n <=m <=10000)

输出

输出n到m之间的所有完数,两个完数之间用一个空格隔开

样例输入 Copy

2 8

样例输出 Copy

6

题解

完数优化的话只用从2查找到n/2+1就行(简单优化);
自定义函数比较方便理解;

代码(AC)

点击查看代码
#include <stdio.h>
int ws(int x)
{   int sum=0;
	for(int i=1;i<x;i++)
	{
		if(x%i==0) sum+=i; 
	}
	if(sum==x) return 1;  //异常退出为真 
	else return 0; //正常退出为假 
}
int main ()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=n;i<=m;i++)
	{
		int flag=0;
		if(ws(i)!=0)//ws(i)为真 
		{
			if(flag!=0) printf(" ");//if(flag)意为flag为真 
			printf("%d",i);
			flag=1;
		}
		if(i==m) printf("\n");
	}
	return 0;
}
posted @ 2022-10-29 23:34  shany212  阅读(30)  评论(0编辑  收藏  举报