批话时间
遥想毕业那年,👴上大学了,雄姿英发。乱写代码,谈笑间,简单题灰飞烟灭。
--念奴娇·大学生活
凌乱的代码,是我回不去的年少时光。
题目
来了来了,大的要来了。
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团荣光,👴辈义不容辞。
完!