C语言入门实战(9):完数判断

这是《C语言入门实战》系列的第9篇。
上一篇:C语言入门实战(8):switch-case计算下一天的年月日(平年/闰年计算)


题目

输入任意一个正整数n,判断n是否为一个完数。

完数是指一个数恰好等于它的因子之和。例如6是一个完数,它等于它的因子 1、2、3的和。类似地28等于其因子1、2、4、7、14的和。

因子不包含自身,且各个因子不能重复。

请编程实现。

要求

输入输出格式示例1:

输入:28<回车>
输出:yes

输入输出格式示例2:

输入:76<回车>
输出:no

参考代码

#include <stdio.h>
#include <stdlib.h>
/**
 * 输入任意一个正整数n,判断n是否为一个完数。
 * 完数是指一个数恰好等于它的因子之和,
 * 例如6是一个完数,它等于它的因子 1、2、3的和。
*/
int main(int argc, char *argv[]) {
	int n;
	scanf("%d", &n);
	
	char* reply = "no";
	// 题目说明了,因子不包含自身
	// 所以,1不是完数,只需要处理>1的情况 
	if(n > 1) {
		// 1作为n(>=2)的因子 
		int factorSum = 1;
		// 计算>=2的其余因子,并累加之 
		int i; 
		for(i=2;i*i<=n;i++) {
			if(n%i == 0) {
				// 找到一个因子i 
				factorSum += i;
				// 另一个因子 
				int other = n/i;
				if(other != i) {
					factorSum += other;
				}
			} 
		} 
		
		// 判断因子的和是否等于n本身
		if(factorSum == n) {
			reply = "yes";
		}
	}
	// 打印输出答案 
	printf("%s", reply);
	return 0;
}

代码复盘

头文件stdio.h中声明的scanf()printf()是标准库中用于处理标准输入和输出的库函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值