题目:求5000以内的亲密数
问题描述:
若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6和6为一对亲密数(即
6自身构成一对亲密数);又如,220的因子之和为1+2+4+5+10+11+22+44+55+110=284,而284的因子之和为1+2+4+71+142=220,因此,220与284为一对亲密数。
具体要求:
1、编制一个函数facsum(m),返回给定正整数m的所有因子(包括1但不包括本身)之和。
2、编写一个主函数,调用1中的函数fassum(),寻找并输出5000以内的所有亲密数对。
3、输出文字说明。在输出每对亲密数时,要求小数在前、大数在后,并去掉重复的亲密数对。
4、采用for循环。
个人观点:数学问题,只要理清逻辑,懂得两次调用facsum()函数,就可以实现。
源程序实现:
/*若正整数A的所有因子(包括1但不包括自身,下同)之和为B,而B的因子之和为A,
则称A和B为一对亲密数。例如,6的因子之和为1+2+3=6,因此6和6为一对亲密数(即
6自身构成一对亲密数);又如,220的因子之和为1+2+4+5+10+11+22+44+55+110=284,
而284的因子之和为1+2+4+71+142=220,因此,220与284为一对亲密数。*/
#include<stdio.h>
int facsum(int m)
{
int sum=1,i=2;
while(i<=m/2)
{
if(m%i==0)
sum=sum+i;
i++;
}
return sum;
}
int main()
{
int m=3,n,k;
while(m<=5000)
{
k=facsum(m);
n=facsum(k);
if(m==n&&m<=k)//限定m<=k,以防重复输出亲密数对。
printf("m=%d,k=%d\n",m,k);
m++;
}
return 0;
}
运行结果: