题解 | #完全数计算#
完全数计算
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); } }
可是,这个数据范围内有四个完全数啊,用例起码覆盖个一半吧,已经和牛客提了这个问题了。