题目
素数的和
小于$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));
}
|
参考链接