这是《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()
是标准库中用于处理标准输入和输出的库函数。