C语言笔试题每日一题3

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
   找出1000以内的所有完数。

思路:

1.先找出一个数的全部因子,求和与这个数进行比较。

2.因本身也是因子,所以只需因子求和减去本身等于本身,即是完数。

3.单独对完数进行格式化输出。

 算法思路:

1.一个数的因子是俩俩结合,例如:6=2*3;12=2*6;一小一大,求出一个因子,另一个因子可用i/j得出。

2.循环条件因此可进行减少,开方i即可。

代码块:

#include <stdio.h>

int main(void)
{
    int i, j, sum, n;
	for(i = 2;i <= 1000; i++)
	{
		sum = 0;
		for(j = 1;j*j <= i;j++)
		{//j为除数,开方i可减少一半计算量
			if(i%j == 0)//可以整除,其为因子
			{
				sum = j + i/j + sum;//因子之和,算上i本身,因为本身也为因子
			}
		}
		if((sum - i) == i )//因子之和减去本身若等于本身,则是为完数
		{//对完数进行格式化输出
			printf("%4d is wanshu:",i);
			for(n = 1; n < i; n++)
			{//将完数单独拿出来分解因数进行输出
				if(i%n == 0)
				{
					printf("%d ", n);//输出因数
				}
		
			}
			printf("\n");
		}
	}
}

 结果演示:

   6 is wanshu:1 2 3 
  28 is wanshu:1 2 4 7 14 
 496 is wanshu:1 2 4 8 16 31 62 124 248 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值