第10题: 两百万以下素数的和

Problem 10: Summation of Primes

题目

素数的和

小于$10$的所有素数的和为$2 + 3 + 5 + 7 = 17$。

求小于两百万的所有素数的和。

Summation of Primes

The sum of the primes below $10$ is $2 + 3 + 5 + 7 = 17$.

Find the sum of all the primes below two million.

解题方法

使用「欧拉线性筛法」求解两百万以下的素数并求和。

参考代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <cstdio>
#include <cmath>
#include <iostream>
#include <vector>
#include <print>

std::uint64_t prime_factor(std::uint64_t num) {
    std::uint64_t sum = 0;
    std::vector<std::uint64_t> result;
    std::vector<std::uint64_t> prime(num + 1, 0);
    std::vector<std::uint64_t> visit(num + 1, 0);
    for (std::uint64_t i = 2; i <= num; ++i) {
        if (!visit[i]) {
            prime[++prime[0]] = i;
            sum += i; // 求和
        }
        for (std::uint64_t j = 1; j <= prime[0] && i * prime[j] <= num; ++j) {
            visit[i * prime[j]] = 1;
            if (i % prime[j] == 0) break;
        }
    }
    return sum;
}

int main() {
    constexpr std::uint64_t N{ 2'000'000llu };
    std::print("Project Euler 10 result: {}\n", prime_factor(N));
}

正确答案

答案
142913828922

参考链接

0%