/**
* 2500年前数学大师毕达哥拉斯发现,220与284两数之间存在下列奇妙的联系:
* 220的真因数之和为 1+2+4+5+10+11+20+22+44+55+110 = 284,
* 284的真因数之和为 1+2+4+71+142 = 220.
* 毕达哥拉斯把这样的数对a,b称为相亲数:a的真因数(小于本身的因数)之和
* 为b,而b的真因数之和为a.
*
* 求4位数以内的所有相亲数对.
*/
#include <stdio.h>
#include <string.h>
#define LEN 10000
int is_repeat(int *p, int len, int value)
{
int ret = 0;
int i = 0;
for (i=0; i<len; i++)
{
if(p[i] == value)
{
ret = 1;
break;
}
}
return ret;
}
int main(int argc, const char *argv[])
{
int a[LEN] = {0};
int b[LEN] = {0};
int i = 0, j = 0;
int sum = 0;
int num = 0;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
for (i=1; i<LEN; i++)
{
/* 分别求每个数的真因数之和 */
for (j=1; j<i; j++)
{
if(i%j == 0 && j<i ){
a[i] += j;
}
}
}
/* 查找4位数以内的所有相亲数对 */
printf("\n查找4位数以内的所有相亲数对,结果如下: \n");
for (i=1; i<LEN; i++)
{
if(a[i] < LEN)
{
sum = a[i];
if(a[sum] == i && sum == a[i] && !is_repeat(b, LEN, i) && i!=sum)
{
num ++;
b[num] = sum;
printf("第 %2d 对相亲数对: %d, %d \n",num, i, sum);
}
}
}
printf("\n"); //换行
return 0;
}
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/024f78f0f736afc3121189deb919ebc4b745126f?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
追问谢谢大神
本回答被提问者采纳