首页 > 其他分享 >C语言 蓝桥杯某例题解决方案(查找完数)

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

时间:2024-11-21 18:18:28浏览次数:3  
标签:arr int sum C语言 蓝桥 num 完数 fac 例题

蓝桥杯原题: 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如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的,因为严谨点讲,用这个东西要输入的参数更多,你必须输入三个参数而不是两个,这给我们带来一些麻烦。

标签:arr,int,sum,C语言,蓝桥,num,完数,fac,例题
From: https://blog.csdn.net/St_Ludwig/article/details/143899713

相关文章

  • 蓝桥杯真题,钟表(测试一下,会做的可以把答案写来评论区)
    提示(不会的看提示)理解钟表指针的运动:秒针每分钟转一圈,即每秒转6度。分针每小时转一圈,即每分钟转6度。时针每12小时转一圈,即每分钟转0.5度。计算角度:秒针的角度S=6m(其中m是秒)。分针的角度M=6f+0.1m(其中f是分)。时针的角度H=30s+0.5f+0.0083m(其中s是小时)。计算......
  • C语言,如何进行多次分割,获取的到多个字符串,组成一个数组
    如"A|B|C|D"根据|分割,得到数组["A","B","C","D"]char*propertyArr[4]={"-1","-1","-1","-1"};custom_string("A|B|C|D","|",propertyArr,4);voidc......
  • 排序算法(选择排序、直接插入排序、冒泡排序、二路归并排序)(C语言版)
    对数组进行排序,主要演示选择排序、直接排序、冒泡排序、二路归并排序算法,附上代码演示一、编写好各类排序方法的函数(1)s_sort(inte[],intn):选择排序。(2)si_sort(inte[],intn):直接插人排序。(3)sb_sort(inte[],intn):冒泡排序。(4)merge(inte[],intn);二路归并排序......
  • 字符串的基本操作(C语言版)
    字符串的判断、查找字符串并返回查找结果一、编写函数:采用顺序结构存储串,编写一个函数substring(strl,str2),用于判定str2是否为strl的子串;编写一个函数,实现在两个已知字符串中找出所有非空最长公共子串的长度和最长公共子串的个数;二、代码演示:1、字符串匹配的源代码:#......
  • C语言分支与循环
    引言C语言是结构化的程序设计语言。结构化的程序通常包括数据的描述和操作的描述两方面的内容,结构指的是顺序结构、选择结构、循环结构。算法广义上来讲,算法是解决某一问题的方法和步骤,狭义的算法是对特定问题求解步骤的一种描述。算法的特性和要素:算法的特性有穷性确定......
  • 并查集 poj 2524,1611,1703,2236,2492,1988 练习集【蓝桥杯备赛】
    目录前言  并查集优势UbiquitousReligionspoj2524  问题描述  问题分析  代码TheSuspectspoj1611  问题描述  问题分析  代码   WirelessNetworkpoj2236  问题描述  问题分析  代码分类带权并查集合  权值树构......
  • 【C语言】自编码器
    描述一下你对自编码器的理解,包括变分自编码器和生成对抗自编码器等。 自编码器(Autoencoder,AE)是一种无监督学习模型,主要用于数据压缩和特征学习。它的基本思想是通过一个编码器网络将输入数据压缩成低维潜在向量,然后通过一个解码器网络尝试从这个潜在向量重构出原始输入。如......
  • 递归之美:C语言中的函数递归
      在编程的世界中,函数递归是一个强大且优雅的概念,它允许一个函数自我调用以解决问题。这种自我调用的特性使得递归在解决某些问题时变得特别高效和直观。本文将深入探讨函数递归的概念、应用以及需要注意的事项。一、递归是什么?        递归是学习C语⾔函数绕不开......
  • c语言中的鞍点问题(详细版)
    1、什么是鞍点什么是鞍点?    鞍点鞍点,就是类似马鞍一样规律的点,即在一个矩阵中是每一行的最大值并且是每一列的最小值。 (无论多大的矩阵,如果存在鞍点,则只有一个,否则不存在鞍点,至于为啥,建议谷歌)2、找出鞍点的思路找出鞍点的思路 需要我们利用枚举数组(ps:不是高深......
  • 【C语言的奥秘3】C语言中的控制语句第二弹
    一、循环语句1、while循环(1)、while循环的执行流程while循环是当条件成立时进入循环体,当条件不成立则结束,不在进入到循环当中去。值得注意的是,while循环在第一次执行时,会先判断循环条件是否为真。如果条件为真,则进入循环体执行语句;如果条件为假,则跳过循环体,直接执行循环后......