305、完美数

对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

给定一个 整数 n, 如果是完美数,返回 true;否则返回 false

  

示例 1

输入:num = 28

输出:true

解释:28 1 2 4 7 14

1247, 和 14 是 28 的所有正因子。

示例 2

输入:num = 7

输出:false

  

提示:

1 <= num <= 108

通过次数61,582提交次数126,165

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/perfect-number

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.isNumber;

/**

 * 507. 完美数 对于一个 正整数,如果它和除了它自身以外的所有 正因子 之和相等,我们称它为 「完美数」。

 *

 * 给定一个 整数 n, 如果是完美数,返回 true;否则返回 false。

 *

 * 来源:力扣(LeetCode) 链接:力扣 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 *

 * @author wen.lei@brgroup.com

 *

 *         2022-2-19

 */

public class PerfectNumber {

    /*示例 1:

     

    输入:num = 28

    输出:true

    解释:28 = 1 + 2 + 4 + 7 + 14

    1, 2, 4, 7, 和 14 是 28 的所有正因子。

    示例 2:

     

    输入:num = 7

    输出:true

      

     

    提示:

     

    1 <= num <= 108*/

    /**

     * 从1到num-1,找出所有因子求和,同num比较。

     * @param num

     * @return

     */

    public boolean checkPerfectNumber(int num) {

        //优化点2点:num=1,特殊判断;遍历的最大值

        int sum = 0;

        for (int i = 1; i < num; i++) {

            if (num % i == 0) {

                sum += i;

            }

        }

        return sum == num;

    }

     

    /**

     * 有问题:本来想的是sum初始化为1,因为1是每个数的因子。但是,特殊num输入“1”,就没判断到排除自己。

     * 这个代码,排除自己本身作为因子,是通过i<num来判定的。

     * 因此:为了优化,结果反而坑了

     * 从1到num-1,找出所有因子求和,同num比较。

     * @param num

     * @return

     */

    public boolean checkPerfectNumberError(int num) {

        int sum = 1;

        for (int i = 2; i < num; i++) {

            if (num % i == 0) {

                sum += i;

            }

        }

        return sum == num;

    }

}

package test.leecode.isNumber;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.isNumber.PerfectNumber;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-19

 */

public class PerfectNumberTest {

    @Test

    public void test() {

        PerfectNumber pn = new PerfectNumber();

        Assert.assertTrue(pn.checkPerfectNumber(28));

        Assert.assertFalse(pn.checkPerfectNumber(2));

        Assert.assertFalse(pn.checkPerfectNumber(3));

        Assert.assertFalse(pn.checkPerfectNumber(8));

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值