算法提高 素数求和(筛选法求素数)

问题描述

输入一个自然数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;
	}
}

发布了33 篇原创文章 · 获赞 3 · 访问量 3782

猜你喜欢

转载自blog.csdn.net/qq_43169220/article/details/103673012
今日推荐