找完数——循环的用法

【问题描述】一个数如果恰好等于它的因子之和,这个数就成为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。编程序打印出1000之内(包括1000)所有的完数,并按如下格式输出其所有因子: 

6 its factors are 1,2,3.

【输入形式】无输入

【输出形式】输出1000以内所有的完数及其因子,每行输出一个完数及其因子。 

6 its factors are 1,2,3.

【提示】完数不止一个哦!而且最后一个数后面的结束标点符号是英文状态的句号。

1.完整代码:

int main()
{
	int x;
	int i;
	int sum;
	int m = 0;
	int n = 0;
	for (x = 2; x <= 1000; x++)
	{
		sum = 1;
		m = 0;
		for (i = 2; i <= x / 2; i++)
		{
			if (x % i == 0)
			{
				sum += i;
				m++;
			}
		}
		if (sum == x)
		{
			n = 0;
			printf("%d its factors are 1,",x);
			for (i = 2; i <=x/2; i++)
			{
				if (x % i == 0)
				{
					n++;
					if (n<m)
					{
						printf("%d,", i);
					}
					else
					{
						printf("%d.", i);
						//printf(".");
					}
				}
			}
			printf("\n");
		}
	}
	return 0;
}

2.算法思路及代码分析:

(1)首先找出1000以内的完数,那么我们需要遍历1000以内的所有数字:那么我们可以利用for循环进行遍历;那么最外层的循环我们就进行1000以内(包含1000)的数字的循环;

for (x = 2; x <= 1000; x++)

(2)其次:我们需要找出每个数的具体的因子:那么我们再次利用for循环进行因子的遍历;

for (i = 2; i <= x / 2; i++)

在这里:为什么使用x/2呢?

原因:因子一定要能够整除,当因子大于x的1/2时,其商一定只能商1,那么一定会由余数,肯定不是它的因子,所以我们只需要遍历1/2的x即可找出所有的因子;

将所有的因子累加与x进行比较,如果相等,那么该数字就是完数;

那么我们需要按要求进行打印:

因为1一定是数字的因子,所以我们直接将其打印出来即可;

printf("%d its factors are 1,",x);

(3)题目要求:6 its factors are 1,2,3.

即数字之间以逗号隔开,而末尾以句号结尾

所以我们需要判断因子是否打印到最后一个因子,所以在这里,设置m,n两个变量,用来辅助判断

用m来汇总因子个数,当n<m时,我们一直以逗号结尾打印;

在这里有两点需要注意:1.m要及时清零,每进行一个完数的判断,我们都需要将m清零,这样才能准确的总结出因子的个数;2.n要及时清零,每进行一个完数的因子的打印,也要将n清零,以便将n下次从0开始++,与m进行比较!

if (sum == x)
		{
			n = 0;
			printf("%d its factors are 1,",x);
			for (i = 2; i <=x/2; i++)
			{
				if (x % i == 0)
				{
					n++;
					if (n<m)
					{
						printf("%d,", i);
					}
					else
					{
						printf("%d.", i);
						//printf(".");
					}
				}
			}
			printf("\n");

最终结果: 

总结:利用循环嵌套,寻找完数!

打印的时候也要注意格式,选择合适地方法进行打印!!!

(如果有更好的方法,欢迎在评论区交流,感谢!!!) 

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值