面试题16

本文介绍了一段用于寻找500万以内亲和数的C语言程序代码。亲和数是指两个数中一个数的所有真因数之和等于另一个数,反之亦然。文章通过具体示例解释了亲和数的概念,并提供了实现这一查找功能的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求500万以内的亲和数。

如果两个数 a 和 b,a 的所有真因数之和等于 b,b 的所有真因数之和等于 a,则称 a,b 是一对亲和数。

220的真因子是:1、2、4、5、10、11、20、22、44、55、110;
284 的真因子是:1、2、4、71、142。
而这两个数恰恰等于对方的真因子各自加起来的和(sum[i]表示数 i 的各个真因子的和),

220=1+2+4+71+142=sum[284],
284=1+2+4+5+10+11+20+22+44+55+110=sum[220]。
得 284 的真因子之和 sum[284]=220,且 220 的真因子之和 sum[220]=284,即有sum[220]=sum[sum[284]]=284。

#include<stdio.h>
#include<string.h>
#define N 5000000

int main() {
    int sum[N + 10];
    int i;

    /*1是除1外所有整数的真因数*/
    for (i = 2; i <= N; i++)
        sum[i] = 1;

    /*对N以内的整数求真因数之和,并存在sum数组中*/
    for (i = 2; i * 2 <= N; i++) {
        int j = 2*i;
        while (j <= N) {
            sum[j] = sum[j] + i;
            j = j + i;
        }
    }

    /*遍历整个数组*/
    for (i = 1; i <= N; i++) {
        if (i<sum[i]&&sum[i]<=N&&i == sum[sum[i]]) {
            printf("%d %d\n", i, sum[i]);
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值