这篇文章讲述的是算法趣味整数部分的亲密数问题的java实现,参考的书籍为清华大学出版社出版,贾蓓等编著的《c语言趣味编程1000例》,如有错误或者不当之处,还望各位大神批评指正。
问题描述
如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的全部亲密数。
算法分析
这题可以使用两层循环分别来判定A和B,外层表示A内层表示B,那么问题就转换为判断A是否有亲密数的问题
取值范围 :
A:[1~end)
B: [1~A)
代码实现
package funnyInteger;
public class Q2_IntimacyNumber {
/**
* 问题描述:如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子
* (包括1,不包括B本身)之和等于A,则将整数A和B称为亲密数。求3000以内的
* 全部亲密数。
*
* 算法描述:这题可以使用两层循环分别来判定A和B,外层表示A内层表示B,那么问题就转换
* 为判断A是否有亲密数的问题
* 取值范围 :
* A:[1~end)
* B: [1~A)
*/
public static void main(String[] args) {
/*设定判断范围*/
int end = 3000 ;
int sum = 0 ;
System.out.println(end+"内的亲密数有:");
/*两层循环来判断A在范围内的亲密数*/
for(int A=1 ; A<end ; A++){
for(int B=1 ; B<A ;B++){
/*分别计算A和B的因子之和*/
int sumA = 0 ;
int sumB = 0 ;
for(int k=1 ; k<A ; k++){ //计算A的因子之和
if(A%k == 0)
sumA+=k ;
}
for(int p=1 ; p<B ; p++){ //计算A的因子之和
if(B%p == 0)
sumB+=p ;
}
/*判断B是否为A的亲密数*/
if(sumA==B && sumB==A){
System.out.println(A+" 的亲密数为:"+B);
sum++ ;
}
}
}
/*输出结果*/
System.out.println("共"+sum+"对");
}
}
样例输出
3000内的亲密数有:
284 的亲密数为:220
1210 的亲密数为:1184
2924 的亲密数为:2620
共3对