假设有a、b两个数,若a的所有因子之和等于b,b的所有因子之和等于a,
并且a不等于b,则称a和b是一对亲密数。如284和220就是一对亲密数。
分析:
若要找出10000以内的亲密数,可使用以下算法:
(1)对每一个数i,将其因子分解出来,并将因子保存到一个数组中,再将因子之和保存到变量b1。
(2)将因子之和b1再进行因子分解,并将因子保存到一个数组中,将因子之和保存到变量b2中。
(3)若b2等于i,并且b1不等于b2,则找到一对亲密数为i和b1,可将其输出。
(4)重复步骤(1)~(3),即可找出指定范围的亲密数。
import java.util.ArrayList;
import java.util.Scanner;
public class 亲密数 {
public static void main(String[] args){
ArrayList a1 = new ArrayList();
ArrayList a2 = new ArrayList();
int b1; // 保存每个数字 i 的所有因子之和
int b2; // 保存 b1 的所有因子之和
int n; // 查找亲密数的范围 n
Scanner scan = new Scanner(System.in);
System.out.print("输入要查找亲密数的范围:");
n = scan.nextInt();
for(int i=2; i<n; i++){ // 循环次数
b1 = 0; // 初始化b1 = 0;
for(int j=1;j<i/2+1;j++){
if(i%j==0){
a1.add(j); // 保存 i 的所有因子
b1 += j; // 保存 i 的所有因子之和
}
}
b2 = 0;// 初始化b2 = 0;
for(int k=1;k<b1/2+1;k++){ // 将 b1 (i 的所有因子之和) 再进行 因子分解
if(b1%k==0){
a2.add(k); // 保存 b1 的所有因子
b2 += k; // 保存 b1 的所有因子之和
}
}
if(b2==i && i<b1){ //判断 A,B 的输出条件
System.out.println(i+"————"+b1 +"是亲密数,各因子为:");
System.out.print(i+"的因子有:"); // 输出一个数的所有因子
for(int x=0;x<a1.size()-1;x++){
System.out.print(a1.get(x)+"+");
}
System.out.println(a1.get(a1.size()-1)+"="+b1);
System.out.print(b1+"的因子有:"); // 输出另一个数的所有因子
for(int x=0;x<a2.size()-1;x++){
System.out.print(a2.get(x)+"+");
}
System.out.println(a2.get(a2.size()-1)+"="+b2+"\n");
}
a1.clear(); // 清空
a2.clear();
}
}
}
输入要查找亲密数的范围:5000
220————284是亲密数,各因子为:
220的因子有:1+2+4+5+10+11+20+22+44+55+110=284
284的因子有:1+2+4+71+142=220
1184————1210是亲密数,各因子为:
1184的因子有:1+2+4+8+16+32+37+74+148+296+592=1210
1210的因子有:1+2+5+10+11+22+55+110+121+242+605=1184
2620————2924是亲密数,各因子为:
2620的因子有:1+2+4+5+10+20+131+262+524+655+1310=2924
2924的因子有:1+2+4+17+34+43+68+86+172+731+1462=2620