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

京公网安备 11010502036488号