算法_趣味整数_Question2_亲密数(java实现)

本文通过双层循环算法实现寻找3000以内的所有亲密数对,即两个整数A和B,A的所有真因子之和等于B,且B的所有真因子之和等于A。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章讲述的是算法趣味整数部分的亲密数问题的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对
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值