【欧拉计划第 10 题】 质数之和 Summation of primes

简介: 【欧拉计划第 10 题】 质数之和 Summation of primes

Problem 10 Summation of primes

The sum of the primes below 10 1010 is

2 + 3 + 5 + 7 = 17 \large 2 + 3 + 5 + 7 = 172+3+5+7=17

Find the sum of all the primes below two million.

问题 10 质数之和

10 1010 以下的质数之和为

2 + 3 + 5 + 7 = 17 \large 2 + 3 + 5 + 7 = 172+3+5+7=17

求两百万以下的所有质数之和

思路分析

首先单看题目知识点,涉及到素数(质数),和第七题 10001st prime一定会有类似之处

我们采用最直接的方法求解(暴力),枚举范围内的所有质数,然后求和

注意,像这样的解决方案并非最佳,只适用于小规模数据,规模的调整对于对应算法的要求很高

比如说,这个题目你可以用暴力枚举解决它。但是,如果我把数据量级调整到亿,这种方法就未必可以使用,需要更高级的算法来解决,具体请参考文末代码段

总之,大家要根据实际情况采用最优的方案来解决对应的问题,没有什么办法可以一劳永逸,适用于所有情况

代码实现

/*
 * @Author: coder-jason
 * @Date: 2022-04-17 15:33:41
 * @LastEditTime: 2022-04-17 16:04:24
 */
#include <bits/stdc++.h>
using namespace std;
long long sum = 0; // 注意数据范围,考虑溢出情况
bool is_prime(int num)
{
    for (int i = 2; i <= sqrt(num); i++)
        if (num % i == 0)
            return false;
    return true;
}
int main()
{
    for (int i = 2; i < 2000000; i++)
        if (is_prime(i))
            sum += i;
    cout << sum << endl;
    return 0;
}

答案:142913828922


埃拉托斯特尼筛

原理:从 2 22 开始,将每个素数的各个倍数,标记成合数。一个素数的各个倍数,是一个差为此素数本身的等差数列,此筛法是列出所有小素数最有效的方法之一

这里使用埃氏筛法解决亿级数据量级问题,实现代码段如下,供参考学习

/*
 * @Author: coder-jason
 * @Date: 2022-04-17 15:33:41
 * @LastEditTime: 2022-04-17 20:33:01
 */
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e9 + 10;
bool vis[maxn];
ll sieve(int n)
{
    ll ret = 0;
    int m = (int)sqrt(n + 0.5);
    for (int i = 2; i <= m; i++) if(!vis[i])
    {
        for (int j = i * i; j <= n; j += i)  vis[j] = true;
        ret += i;
    }
    for(int i = m+1;i <= n;i++)  if(!vis[i])
        ret += i;
    return ret;
}
int main()
{
    printf("%lld\n", sieve(1000000000));
    return 0;
}



相关文章
|
4月前
|
Java C++
筛法求质数
筛法求质数
47 0
|
10月前
|
C++
筛质数、分解质因数和快速幂的应用
筛质数、分解质因数和快速幂的应用
58 0
|
5天前
|
移动开发 算法
求其最大公约数和最小公倍数
求其最大公约数和最小公倍数。
32 5
|
4月前
分解质因数答疑 为什么只需要枚举到根号N 为什么n % i == 0就是质数
分解质因数答疑 为什么只需要枚举到根号N 为什么n % i == 0就是质数
53 0
|
10月前
一个求公约数和公倍数的有趣求法
一个求公约数和公倍数的有趣求法
46 0
Fibonacci数列的多种求法
Fibonacci数列的多种求法
67 0
|
算法 C语言 C++
【数论】最大公约数、约数的个数与约数之和定理
先来科普下什么是约数:当a能被b整除,我们就说b为a的约数,b的倍数为a
102 0
求解最大公约数和最小公倍数
求解最大公约数和最小公倍数
求解最大公约数和最小公倍数
|
机器学习/深度学习 C语言
【C素数】素数(质数)和分解质因数
【C素数】素数(质数)和分解质因数
115 0
【C素数】素数(质数)和分解质因数
求100以内质数或者更多
求100以内质数或者更多
94 0