求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;
}