菜蛙


私信TA

用户名:hu2022

访问量:16333

签 名:

明日复明日,明日何其多。我生待明日,万事成蹉跎。

等  级
排  名 546
经  验 4391
参赛次数 0
文章发表 75
年  龄 0
在职情况 学生
学  校 哈工程
专  业

  自我简介:

题目:

两个不同的自然数A和B;

如果整数A的全部因子(包括1,不包括A本身)之和等于B;

且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。

求3000以内的全部亲密数。


解题步骤:

1.计算数字2的全部因子之和sum1

2.计算sum1的全部因子之和sum2

3.sum2与2相等,且sum2小于sum1,则按正确格式输出sum2、sum1

4.依次重复以上计算,直到数字3000


思路分析:
1.显然数字1没有亲密数,因而从2开始;

2.得到数字A的因子之和后,将和做数字B,计算其因子之和。此时A的因子之和已经等于B,只需要比较B的因子之和是否等于A——若相等,则A与B是一对亲密数;

3.得到一对亲密数后,还需要弃去冗余结果,如当A=220时可以得到B=284,而当A=248时又会的得到B=220。故增加A>B的筛选条件,弃去冗余后得到正确结果。


参考代码:

#include<stdio.h>

int main(void){
	int i,j;
	int sum1,sum2;
	
	for(i=2;i<=3000;i++){
		sum1 = 0;
		sum2 = 0;
		
		for(j=1;j<i;j++){            //计算数字i的因子之和sum1 
			if(i%j==0)
			sum1 += j;
		}
		
		for(j=1;j<sum1;j++){        //计算因子sum1的因子之和sum2 
			if(sum1%j==0)
			sum2 += j;
		}
		
		if(sum2==i&&sum1>sum2)       //若sum2与数字i相等则两数互为亲密数,加上第二个条件排除重复数对 
		printf("(%d,%d)",sum2,sum1);
	}
	
	return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »