前言
如果整数A的全部因子(包括1,不包括A本身)之和等于B,且整数B的全部因子(包括1,不包括B本身)之和等于A,则称整数A\B是一对亲密数。求3000以内的全部亲密数。
思路
1.从哪开始
我们只有一个已知条件,A、B这两个数在3000以内,只能穷举,把一个具体的数代入A或者B。因为1的因子只有一个,是它本身,不能包括1的同时去掉本身,那我的循环应该从2开始,结束条件是小于3000。在循环次数已知的情况下,可以选用for循环解决这个问题。
for (int i = 2; i <= 3000; i++) {
}
2.要满足的条件
**(A的因子和)- A =(B的因子和 - B)**
3.提取方法
我们要求A、B的因子和,参数不能,返回数据类型相同,可以提取一个方法,求出A、B因子的和(不包括本身)
/**
* @param num
* @return 因子的和(不包括本身)
*/
public static int getDivisorSum(int num) {
int sum = 0;
for (int i = 1; i < num; i++) {//i!=num 求和时不带num本身 达到我们想要的效果
if (num % i == 0) {
sum += i;
}
}
return sum;
}
4.假设从A开始穷举
那么A=i,把A代入方法, 可以得到A的因子的和(不包括本身)。根据题目要求,这个数是应该等于B的,那么B=getDivisorSum(i)。因为i是具体数值,所以可以算出B的具体数值,再把B的值代入方法,同理是可以得到A的具体值的,A=getDivisorSum(aSum)。这时有两个具体的A值,只有这两个值相等,才是满足我们要求的。
5.代码
代码如下(示例):
public static void main(String[] args) {
for (int i = 2; i <= 3000; i++) {
int aSum = getDivisorSum(i);//整数A的全部因子(包括1,不包括A本身)之和 i即为A 得到的aSum即为B(aSum=B)
int bSum = getDivisorSum(aSum);//将B代入方法得到整数B的全部因子(包括1,不包括B本身)之和,这个方法的返回值即为A B=aSum A=bSum A=i
if (bSum == i && aSum < bSum) {//两个A的值相等,才是满足条件的结果 aSum < bSum 是为了去掉重复的值(如果这两个数可以相等,可以加上=)
System.out.println("整数" + aSum + "\\" + bSum + "是一对亲密数");
}
}
}