问题描述
输入一个自然数n,求小于等于n的素数之和
样例输入
2
样例输出
2
数据规模和约定
测试样例保证 2 <= n <= 2,000,000
思路
这道题要注意数据规模,n的最大值为2000000,如果用测试法判断每一个数的能否被它的因子整除会超时
这里用筛选法求素数:
i从2开始,把i的所有倍数都筛选掉,最后剩下的都是素数
代码
import java.util.Scanner;
public class SumOfPrime {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
input.close();
System.out.println(prime(n));
}
public static long prime(int n) {
int[] array = new int[n + 1];
/*
* x从2开始,把x的倍数全部筛选掉(置为-1)
*/
int x = 2;
while(x < array.length) { //已经标记过的数不再重复标记
if(array[x] != 0) {
x++;
continue;
}
int k = 2;//倍数
while(x * k < array.length) {
array[x * k] = -1;
k++;
}
x++;
}
long sum = 0;
for (int i = 2; i < array.length; i++) {
if(array[i] == 0)
sum+= i;
}
return sum;
}
}