亲密数的定义是:两个不同的数字,如果它们的所有真因子(不包括它们自身)之和是彼此的数字,那么这两个数字就是亲密数。例如:
220 的真因子是 1、2、4、5、10、11、20、22、44、55 和 110,它们的和是 284。
284 的真因子是 1、2、4、71 和 142,它们的和是 220。
因此,220 和 284 是一对亲密数。
public class AmicableNumbers {
public static void main(String[] args) {
// 输出 1 到 10000 之间的所有亲密数
printAmicableNumbers(1, 10000);
}
/**
* 打印指定范围内的所有亲密数
* @param start 搜索范围的下限
* @param end 搜索范围的上限
*/
public static void printAmicableNumbers(int start, int end) {
// 遍历从 start 到 end 的所有数字
for (int i = start; i <= end; i++) {
// 获取 i 的亲密数
int friendNumber = getFriendNumber(i);
// 如果 friendNumber 存在且等于 i,则打印它们是一对亲密数
if (friendNumber > 0 && getFriendNumber(friendNumber) == i && i < friendNumber) {
System.out.println(i + " and " + friendNumber + " are amicable numbers.");
}
}
}
/**
* 获取一个数字的亲密数
* @param num 待求亲密数的数字
* @return 如果 num 存在亲密数,返回亲密数;否则返回 0
*/
private static int getFriendNumber(int num) {
// 计算 num 的因子和
int sumOfFactors = getSumOfFactors(num);
// 如果 sumOfFactors 不等于 num,且 sumOfFactors 的因子和等于 num,则 sumOfFactors 是 num 的亲密数
if (sumOfFactors != num && getSumOfFactors(sumOfFactors) == num) {
return sumOfFactors;
}
// 否则,num 没有亲密数
return 0;
}
/**
* 计算一个数字的因子和
* @param num 待计算的数字
* @return 数字的因子和
*/
private static int getSumOfFactors(int num) {
int sum = 0;
// 遍历 1 到 num/2 的所有数字,检查它们是否是 num 的因子
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
sum += i;
}
}
return sum;
}
}
这个算法的实现步骤如下:
- 在 printAmicableNumbers 方法中,遍历从 start 到 end 的所有数字。
- 对于每个数字 i,调用 getFriendNumber 方法,获取它的亲密数。
- 如果 i 的亲密数 friendNumber 存在且等于 i,并且 i 小于 friendNumber,则打印它们是一对亲密数。
getFriendNumber 方法的实现步骤如下:
- 调用 getSumOfFactors 方法,计算输入数字 num 的因子和。
- 如果 sumOfFactors 不等于 num,且 sumOfFactors 的因子和等于 num,则 sumOfFactors 是 num 的亲密数,返回 sumOfFactors。
- 否则,num 没有亲密数,返回 0。
getSumOfFactors 方法的实现步骤如下:
- 初始化一个变量 sum 来保存因子和。
- 遍历 1 到 num/2 的所有数字,检查它们是否是 num 的因子。
- 如果是,则将它们累加到 sum 中。
- 最后返回 sum。
通过这个算法,我们可以找到 1 到 10000 之间的所有亲密数。