亲和数

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

 例如220和284,1184和1210,2620和2924。 分析: 首先得明确到底是什么是亲和数? 亲和数问题最早是由毕达哥拉斯学派发现和研究的。

他们在研究数字的规律的时候发现有以下性质特点的两个数: 

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]。 

实现代码如下:

int aNear[50010];
	for(int n=1;n<50010;n++){
		aNear[n] = 1;
	}
	for(int k = 2;k<25000;k++){
		int j = k + k;
		while(j<50000){
			aNear[j] += k;
			j = j+k;
		}
	}
	for(int d=220;d<50010;d++){
		if(aNear[d]>d&&aNear[d]<50000&&(d == aNear[aNear[d]])){
			printf("\n");
			printf("%d  %d",d,aNear[d]);
		}
	}
该方法是从下到大判断某个数,假如该数是某个数的因子则加上去;

比如:当k为2时,就将2,4,6,8.....加上2

    k为3时,将3,6,9,12.... 加上3依此类推,最终的到完整的数据

以上信息来自《程序员编程艺术》



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值