小练习:亲密数

1.引入

  我们已经在前面学习了分支选择结构以及循环结构,我们今天便用亲密数这个常见的算法题来巩固一下我们的掌握程度吧,(补充这道亲密数也是我们华中科技大学大一今晚上机的测试题之一),一起来看看吧。

2.题目介绍

打印输出500以内的所有亲密数,并输出所有亲密数之和。

要求:

1)程序中既要有for循环也要有while或do…while循环

2)在输出每对亲密数时,小数在前、大数在后,并去掉重复的亲密数对,例如:220和284是一对亲密数,而284和220也是一对亲密数,只输出220和284这对“亲密数”

3)输出要有文字说明。输出时每对亲密数用一对圆括号括起来,两数间逗号隔开,每对占一行

4)“亲密数”定义:如果自然数M的所有因子(包括1不包括M本身)之和为N,而N所有因子和为M,则M和N为一对亲密数。如:6所有因子和=1+2+3=6,所以,6和它自身构成一对“亲密数”。

3.题目分析

  首先我们要知道亲密数的定义,一定是两个相互的因子和等于彼此才是,如果只是一方等于则不算。难点就是这个我们要如何才能知道某个数的因子和。这道题的难度还是蛮大的,实际上。

  通过因子我们知道,即一个数被他的因子除后一定是没有余数的,也就是说我们可以通过判断是否求余为0来得知是否为因子。但我们求因子我们知道1是任何数的因数,而1没有因子,所以我们输入的数应该是大于的,同时我们也可以推知一个数的因子,一定不会超过它的一半,否则除后就是分数了。

  所以我们可以先得到求某个数的因子的和计算方法:

#include<stdio.h>
int main()
{
int sum = 0;
int a = 0;                       //变量的初始化。
printf(" 请输入你要求的数:")    //必要的输入提示。
scanf("%d",&a)                 //从用户端获取数据。
for(int i = 1; i <= a/2 + 1 ; i++)      //for循环语句由初始化;判断部分;调整部分组成,此处循环语句的使用时为了方便我们从一到这个数的一半一一判断是否为a的因子。
{
   if(a%i==0)
   {
    sum += i                   //sum为对i(因子)进行求和
   } 

}
print("因子和为%d",sum)
}

  同时,这里要补充的一点是我们在写if(a%i==0)时一定要注意判断是否相等时一定要用==,而不能只是用=,我就在编译这个代码时,因为这个小细节,出现左值应为可变化的值类似的警告。而卡住了一段时间。

  然而,当我们解决了因子和这一难关时,却有又一道坎摆在我们面前,接下来,我们要判断两个是否互为亲密数,而且这两个数也可以相等,同时也要约束在500以内。

#include<stdio.h>

int sumclose(int num)  //这里的sumclose实际上便是我们求因子和所用的操作,只不过我们在此时用外部函数的形式来表示这一运算,避免我们等一下连续写两遍这样的函数来求A与B的因子和。列函数的目的正是为了方便自己以及减少潜在的错误
{
	int sum = 0;
	int i = 1;
	while( i < num)
	{
		if (num % i == 0)
			sum += i;
		i++;
	}
	return sum;
}

int main()
{
	int A = 2;  //取A等于2为初始值,是我们已经知道了1是没有的,从而尽量使自己的代码完美
	for (int A = 2; A <= 500; A++)  //这里对A使用循环语句是为了判断A在500内的因子和的所有可能。
	{
		int B = 0;
		B = sumclose(A);
		if (B >= A && B <= 500 && sumclose(B) == A)  //这里使用B是为了方便我们找与A相对应的亲密数,同时通过相互表示来确定是否A与B为亲密数,不等号的设定是为了满足题目中要求小的在前,大的灾后的条件。
		{
			printf("(%d,%d)\n", A, B);
		}
	}
	int z = 6 + 6 + 28 + 28 + 220 + 284 + 496 + 496;
	printf("亲密数和为%d", z);


}

  同时这里再次强调一下,B=sumclose(A),sumclose(B)==A两个不一样,一个是赋值,另一个是判断是否取等,我当时第二个就是傻傻用了等号,然后卡住了好久。

  美中不足的是最后我的求和,实在不知道如何把每一个数据保存下来并求和,只能在最后先运行得到答案再进行求和。有大佬的话也可以给小白提意见,改进程序。

  • 47
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三千弱水,取一瓢饮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值