C语言 蓝桥杯某例题解决方案(查找完数)

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


这个题没有很大的难点,与我们上一个解决的问题**"质因数分解"**不同,它不需要判断因数是否是质数,因此我们的工作量会小很多。

现在我们的想法还是类似,首先找到一个数字所有的真因子,这可以靠for循环之类的东西解决,尤其是因为需要找的是真因子,因此需要把这个数字本身排除掉,也就是说,我们设置for的时候要让那个控制参数小于数字本身,以防止数字本身混进去。

然后我们要把它们作为**"候补因子(Candidate factors)"**存入一个数组arr中。

注意:事实上我们可以取消arr的过程,就好像我们质因数分解的题目里面也有办法取消这个存储的过程,直接用sum+=该数就可以解决,然而这次为了解释清楚我们的行为逻辑,先不进行该升级,之后我会把不需要arr的方案给出,这次我们先进行需要arr存储候补因子的方案解释。

下一步,我们把这些候补因子全部加起来存入整型变量sum中,这时候我们已经找到了数字所有真因子之和,只需要判断这个和是否与数字本身相等,如果相等说明数字是完数,于是我们用printf输出它,如果不是,则不输出它。

将以上所有过程套上一个for循环,就可以检查从1开始直到1000所有的数字并找出其中的完数,事实上你可以再用一个scanf控制的变量替代1001的位置,这样你就可以检验任意位置以内的所有完数。

下面我们展示完整的代码:

cpp 复制代码
#include<stdio.h>
int main()
{
	int num = 2;
	int fac = 1;
	int arr[200] = { 0 };
	int t = 0;
	int sum = 0;
	for (num = 2; num < 1001; num++) {
		for (fac = 1; fac < num; fac++) {
			if (num % fac == 0) {
				arr[t] = fac;
				t++;
			}
		}
		while (t >= 0) {
			sum += arr[t];
			t--;
		}
		if (sum == num) {
			printf("%d\n", num);
		}
		t = 0; sum = 0;
		for (t = 0; t < 200; t++) {
			arr[t] = 0;
		}
		t = 0;
	}

	return 0;
}

如果你决定尝试上面提到的那个可以检验任意位置以内的完数的方法的话,请不要忘记加上一句"#define _CRT_SECURE_NO_WARNINGS"以防止scanf报错说不安全,或者直接使用scanf_s,但是我个人是不喜欢用scanf_s的,因为严谨点讲,用这个东西要输入的参数更多,你必须输入三个参数而不是两个,这给我们带来一些麻烦。

相关推荐
xsyaaaan4 分钟前
leetcode-hot100-双指针:283移动零-11盛最多水的容器-15三数之和-42接雨水
算法·leetcode
一方热衷.2 小时前
YOLO26-Seg ONNXruntime C++/python推理
开发语言·c++·python
炽烈小老头3 小时前
【每天学习一点算法 2026/03/08】相交链表
学习·算法·链表
串口哑火达人3 小时前
(六)RT-Thread网络通信--AT组件与ESP8266
c语言·单片机·嵌入式硬件·mcu·物联网
凤山老林4 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
一碗白开水一4 小时前
【工具相关】OpenClaw 配置使用飞书:打造智能飞书助手全流程指南(亲测有效,放心享用)
人工智能·深度学习·算法·飞书
清汤饺子4 小时前
用 Cursor 半年了,效率还是没提升?是因为你没用对这 7 个功能
前端·后端·cursor
雨夜之寂4 小时前
Browser Use + DeepSeek,我踩了哪些坑
后端·面试
仰泳的熊猫4 小时前
题目2194:蓝桥杯2018年第九届真题-递增三元组
数据结构·c++·算法
wefly20174 小时前
开发者效率神器!jsontop.cn一站式工具集,覆盖开发全流程高频需求
前端·后端·python·django·flask·前端开发工具·后端开发工具