1、亲密数,你亲密个锤子哦

这篇博客回顾了作者在大学时期初次接触编程时的经历,通过解决寻找亲密数(互为真因数和的两个数)的问题,展示了从理解概念到实现代码的过程。作者分享了如何遍历寻找一个数的真因数并检查是否为亲密数的代码,并逐步扩展到找出一定范围内所有亲密数。文章以轻松幽默的文笔穿插个人感慨,最后以寻找更大范围内的亲密数作为结尾,表达了对编程的热爱。
摘要由CSDN通过智能技术生成

批话时间

  遥想毕业那年,👴上大学了,雄姿英发。乱写代码,谈笑间,简单题灰飞烟灭。
                      --念奴娇·大学生活
在这里插入图片描述

  凌乱的代码,是我回不去的年少时光。
在这里插入图片描述

题目

  来了来了,大的要来了。

  2500年前数学大师毕达哥拉斯就发现,220与284两数之间存在着奇妙的联系:
220的真因数之和为:1+2+4+5+10+11+20+22+44+55+110=284
284的真因数之和为:1+2+4+71+142=220
  毕达哥拉斯把这样的数对称为相亲数。相亲数,也称为亲密数,如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。
  从键盘任意输入两个整数m和n,编程判断m和n是否是亲密数。若是亲密数,则输出“Yes!”,否则输出“No!”

分析

现在看来确实简单,当时却挠破了头。

  难点在于,怎么去求真因数。

  我们可以直接使用遍历的方法,寻找一个数的所有因子。如果原数num和一个数a的余数为0,那么这个数a就是num的因子。

以下是公因数和的函数

int commomFactor(int num)
{
	int i,sum = 0;
	//因为因子一定不会大于原数的一半,所以不用全部遍历。
	for (i = 1; i <= num / 2; i++)
	{
		if (num % i == 0)
			sum = sum + i;
		else continue;
	}
	return sum;
}

  结果就已经很明显了。

代码实现

#include<stdio.h>
int commomFactor(int num)
{
	int i,sum = 0;
	//因为因子一定不会大于原数的一半,所以不用全部遍历。
	for (i = 1; i <= num / 2; i++)
	{
		if (num % i == 0)
			sum = sum + i;
		else continue;
	}
	return sum;
}
int main()
{
	int  num1, num2, sumNum1 = 0, sumNum2 = 0;
	printf("输入第一个数字num1\n");
	scanf("%d", &num1);
	printf("输入第二个数字num2\n");
	scanf("%d", &num2);
	sumNum1 = commomFactor(num1);
	sumNum2 = commomFactor(num2);
	if (sumNum1 == num2 && sumNum2 == num1)
		printf("Yes!\n");
	else
		printf("No!\n");
	return 0;
}

  easy!
  写完以后,还是有点意犹未尽。亲密数对吧,连数字都能找到另一半,可惜了我这么好的苗子。然后越想越气,这不把所有亲密数找出来,然后一把火扬了。

  说干就干,那就先找出1000以内的亲密数,然后动手,诶嘿。

代码实现

#include<stdio.h>
int commomFactor(int num)
{
	int i,sum = 0;
	//因为因子一定不会大于原数的一半,所以不用全部遍历。
	for (i = 1; i <= num / 2; i++)
	{
		if (num % i == 0)
			sum = sum + i;
		else continue;
	}
	return sum;
}
int main()
{
	int i, num1, num2, sumNum1 = 0, sumNum2 = 0;
	for (i = 2; i <= 1000; i++)
	{
		sumNum1 = commomFactor(i);
		sumNum2 = commomFactor(sumNum1);
		//此处i <sumNum1 是为了防止相同数据的出现
		if (i == sumNum2 && i < sumNum1)
			printf("亲密数出现了,是%8d  %8d\n", i, sumNum1);
	}
}

在这里插入图片描述

非常无语,咋就你们两个。既然这样,那就扩大范围,直接冲到10w内,嘿嘿。
看看结果
在这里插入图片描述
搞定,以后找机会把他们全办了。

如今亲密数就在眼前,我必须考虑这会不会是我此生仅有的机会。我相信FFF团在过去的霸主地位,大家功不可没。重振FFF团荣光,👴辈义不容辞。

在这里插入图片描述
完!

  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值