用递归程序求解随机产生一个正整数n(n>=100000),确定n是否是它所有因子之和

本文介绍了如何使用递归算法解决确定大于100000的正整数是否为完数的问题。通过求解平方根减少因子计算次数,避免了内存溢出和效率低下,降低了时间复杂度。
摘要由CSDN通过智能技术生成

用递归程序求解随机产生一个正整数n(n>=100000),确定n是否是它所有因子之和(完数)

  1. 了解什么是因子:因子就是所有可以整除这个数的数,不包括这个数自身,例如:6的因子为1,2,3。

  2. 完数:即某正整数的所有因子之和等于该数,即为完数。例:6的因子为1,2,3且6=1+2+3;即称6为完数。

  3. 进行分析,要求利用递归实现,递归是一种直接或间接引用自身的定义方法。一个合法的递归定义包括两部分:基础情况和递归部分。基础情况以直接形式明确列举新事物的若干简单对象,递归部分给出有简单(或较简单)对象定义新对象的条件和方法。

  4. 本题要求编写一个算法实现该功能,算法讲究性能,即时间复杂度和空间复杂度,一个好的算法不仅能够准确运行,而且他的时间复杂度很低。算法具有五个特性:a,有0个或者多个输入;b,至少有1个或者多个输出;c,算法具有确定性;d,算法的指令有限;e,算法具有可行性。

  5. 对于该问题,首先先求一个整数的所有因子,在程序中即对该数依次进行求模运算,结果为0则代表是因子。
/**
 * 求一个正整数的所有因子之和等于该数
 * @author zclong
 *
 */
public class test {

    public static void main(String[] args) {
        //产生随机数
        int value = (int) (Math.random()*1000000);
        //计算因子之和
        int sum = 0;
        //定义一个list数组存储因子
        List<Integer> list = new ArrayList();
        //对随机数进行遍历
        long startTime = System.currentTimeMillis();
        for (int j = 1; j <= value-1; j++) {
            if(value % j == 0) {
                list.add(j);
                sum = sum + j;
            }
        }
        long endTime = System.currentTimeMillis();
        if(sum == value) {
            System.out.println("因子个数" + list.size() + &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值