C语言,求助大神,在线等

如题所述

#include <stdio.h>

#define LEN 10000

int factorsSum(int n) { /*求真因数之和*/
int i, sum=0;

    for(i=1; i<n; i++)
        if(n%i == 0)
            sum += i;
    return sum;
}

int main (void) {
    int numberFactorsSum[LEN], i, j;
    
    for(i=1; i<LEN; i++) /*求 1-(LEN-1) 之间每个数的真因数之和*/
        numberFactorsSum[i] = factorsSum(i);

    for(i=1; i<LEN; i++)
        for(j=i+1; j<LEN; j++) /*判断 i 和 j 是否为相亲数数*/
            if(numberFactorsSum[i] == j && numberFactorsSum[j] == i) 
                printf("%d %d\n", i, j);        
    return 0;
}

运行结果

温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-06-28
/**
 * 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;
}

追问

谢谢大神

本回答被提问者采纳
第2个回答  2017-06-28