题解 | #完全数计算#

完全数计算

https://www.nowcoder.com/practice/7299c12e6abb437c87ad3e712383ff84

import java.util.Scanner;
import java.util.stream.Stream;

/**
 * @author hll[yellowdradra@foxmail.com]
 * @since 2023-03-15 16:56
 **/
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long count = Stream.iterate(1, i -> i + 1)
                .limit(in.nextInt())
                .map(Main::isPerfectNumber)
                .parallel()
                .filter(x -> x)
                .count();
        System.out.println(count - 1);
    }

    public static boolean isPerfectNumber(int n) {
        // 数据范围 [1, 500000]
        int sum = 1;
        // 我们获得真因子时,都是成对获得的,所以从左边界开始遍历真因子时,就会获得右边界。
        int r = n;
        for (int i = 2; i < r; i++) {
            if (n % i == 0) {
                sum += i;
                r = n / i;
                if (r != i) {
                    sum += r;
                }
                if (sum > n) {
                    return false;
                }
            }
        }
        return sum == n;
    }
}

这个题目的用例有问题,我刚开始写完通过了,然后多瞅了一眼,不对啊,我这逻辑能对的?然后测试了下,你即使这样写,也能过去的:

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println(3);
    }
}

可是,这个数据范围内有四个完全数啊,用例起码覆盖个一半吧,已经和牛客提了这个问题了。

全部评论

相关推荐

牛客583549203号:腾讯还好,况且实习而已,实习生流动性很大,属于正常现象,记得和HR委婉解释
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务