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

ops/2024/11/24 16:24:42/

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


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

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

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

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

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

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

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

#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的,因为严谨点讲,用这个东西要输入的参数更多,你必须输入三个参数而不是两个,这给我们带来一些麻烦。


http://www.ppmy.cn/ops/136344.html

相关文章

LeetCode 1861. Rotating the Box

&#x1f517; https://leetcode.com/problems/rotating-the-box 题目 给一个 m * n 的二维数组&#xff0c;# 代表花&#xff0c;* 代表墙二维数组顺时针旋转 90 度&#xff0c;# 会根据重力下落&#xff0c;要么到 * 被挡住&#xff0c;要么到底被挡住返回经过旋转后的二维…

企业办公自动化:Spring Boot OA管理系统详解

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理企业OA管理系统的相关信息成为必然。开发合…

LlamaIndex+本地部署InternLM实践

LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 ‌LlamaIndex‌是一个将大语言模型&#xff08;LLMs&#xff09;和外部数据连接在一起的工具&#xff0c;主要用于增强大模型的知识获取能力…

高级java每日一道面试题-2024年11月22日-JVM篇-说说堆和栈的区别?

如果有遗漏,评论区告诉我进行补充 面试官: 说说堆和栈的区别? 我回答: 在 Java 高级面试中&#xff0c;关于堆和栈的区别是一个常见的问题。堆和栈是 JVM&#xff08;Java虚拟机&#xff09;内存模型中的两个重要部分&#xff0c;它们在程序执行过程中扮演着不同的角色。下…

高精度计算题目合集

高精度计算题目合集 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 高精度加法原理&#xff1a; a&#xff0c;b&#xff0c;c 都可以用数组表示。这些都是基于c语言的算术运算符形成的运算。 c 3 ( c 1 c 2 ) % 10 c_3(c_1c_2)\%1…

SQL MAX() 函数深入解析

SQL MAX() 函数深入解析 概述 SQL&#xff08;Structured Query Language&#xff09;是一种广泛使用的数据库查询语言&#xff0c;它允许用户从数据库中检索、更新和管理数据。在SQL中&#xff0c;MAX() 函数是一个常用的聚合函数&#xff0c;用于从数据集中找出某一列的最大…

使用ENSP实现NAT

一、项目拓扑 二、项目实现 1.路由器AR1配置 进入系统试图 sys将路由器命名为R1 sysname R1关闭信息中心 undo info-center enable进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为12.12.12.1/30 ip address 12.12.12.1 30进入e0/0/1接口 int g0/0/1将g0/0/1接口IP地址配置…

版本控制和idea简体中文教程

版本控制是一种管理软件开发过程中代码变更的技术。它允许多个开发者协作编辑同一个项目&#xff0c;同时跟踪每个变更的历史记录&#xff0c;以便在需要时恢复到之前的版本。版本控制系统&#xff08;Version Control System, VCS&#xff09;是实现版本控制的具体工具。 16.…