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

Problem 10 Summation of primes

The sum of the primes below 10 10 10 is

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

Find the sum of all the primes below two million.

问题 10 质数之和

10 10 10 以下的质数之和为

2 + 3 + 5 + 7 = 17 \large 2 + 3 + 5 + 7 = 17 2+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 2 2 开始,将每个素数的各个倍数,标记成合数。一个素数的各个倍数,是一个差为此素数本身的等差数列,此筛法是列出所有小素数最有效的方法之一

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

/*
 * @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;
}

更多关于本题的解决方案,详见 求十亿内所有质数的和,怎么做最快?

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
### 回答1: 微分方程数值解法(Numerical Methods for Differential Equations)是一门重要的应用数学课程,能够解决许多实际问。第四的问要求我们用欧拉显式法(Euler's explicit method)来求解一阶常微分方程的初值问。 根据欧拉显式法的求解公式,我们可以得到迭代公式: $$y_{n+1}=y_n+hf(t_n,y_n)$$ 其中,$y_n$ 表示第 $n$ 步时的近似解,$h$ 表示步长,$f(t,y)$ 表示微分方程中的函数。目中给出的微分方程为$\frac{dy}{dt}=e^t-y$,初值为$y(0)=1$。 我们可以先确定步长,根据目所给条件,步长 $h=0.1$。接下来,我们可以根据迭代公式,求解近似解: $$\begin{aligned} y_1&=y_0+hf(t_0,y_0)\\ &=1+0.1(e^0-1)\\ &=1.1 \end{aligned}$$ $$\begin{aligned} y_2&=y_1+hf(t_1,y_1)\\ &=1.1+0.1(e^{0.1}-1.1)\\ &=1.19 \end{aligned}$$ $$\cdots$$ 我们可以继续按照以上迭代公式,求解出 $y_3=1.267$, $y_4=1.416$, $y_5=1.651$ 等近似解,直至 $n=5$。最后的结果为:$y(0.5)\approx 1.651$。 因此,欧拉显式法求解该初值问的近似解为 $y(0.5)\approx 1.651$。 ### 回答2: 第四要求用改进的欧拉公式法求解微分方程dy/dx=1-x-y,y(0)=1,在x=0到x=1的区间内,步长为h=0.1。使用改进的欧拉公式法,需要先使用欧拉法计算出初始点,然后再使用改进的欧拉公式法进行迭代求解。该方法的迭代公式为y_n+1 = y_n + h/2(f(x_n, y_n) + f(x_n+1, y_n+h*f(x_n, y_n)))。 具体实现步骤如下: 1.将微分方程dy/dx=1-x-y转化为差分方程(y_n+1 - y_n)/h = 1 - x_n - y_n 2.根据初始条件y(0)=1,可以得到y_0=1 3.使用欧拉法求得y_1: y_1 = y_0 + h*f(x_0, y_0) = 1 + 0.1*(1-0-1) = 0.9 4.使用改进的欧拉公式法求解y_2到y_10: -迭代公式为y_n+1 = y_n + h/2(f(x_n, y_n) + f(x_n+1, y_n+h*f(x_n, y_n)))。 -代入f(x_n, y_n) = 1 - x_n - y_n可以得到y_n+1 = y_n + h/2(1 - x_n - y_n + 1 - (x_n+1) - (y_n+h*(1-x_n-y_n)))) -根据上式逐步计算得到y_2=0.8125,y_3=0.7536,y_4=0.7248,y_5=0.7203,y_6=0.7347,y_7=0.7615,y_8=0.7940,y_9=0.8269,y_10=0.8568。 5.最终的数值解为y(1)=y_10=0.8568。 6.需要注意的是,在每次计算y_n+1时,需要将y_n+1的值代入下一次迭代计算中。 通过使用改进的欧拉公式法,可以得到y(1)的数值解为0.8568。这种方法的优点在于计算简单,容易实现,但是误差较大,在实际应用中需要慎重考虑。 ### 回答3: 第四要求利用欧拉公式,应用数值解法来计算微分方程y'=f(x,y)在特定条件下的近似解,并给出解的误差估计。 欧拉公式是一种基本的数值解法,利用直线近似来逼近真实函数的变化。对于微分方程y'=f(x,y),欧拉公式的推导是:将微分方程离散化,得到Δy= f(x,y)Δx,即变化量Δy等于f(x,y)在Δx内的积分。将Δy与y(x+Δx)近似等于y(x)+f(x,y)Δx,即可得到欧拉公式的计算公式: y(x+Δx) ≈ y(x) + f(x,y)Δx 根据欧拉公式,我们可以逐步计算微分方程的近似解。误差估计可以利用泰勒公式进行计算。泰勒公式是一种利用函数在某个点附近的多项式逼近来估计近似解的方法。误差估计公式为: y(x+Δx) - y(x) = f(x,y)Δx + 1/2f'(x,y)Δx^2 + O(Δx^3) 其中O(Δx^3)表示高阶无穷小量,可以忽略。利用泰勒公式计算误差估计,可以将近似解与精确解之间的误差控制在一定范围内。 综上所述,对于微分方程数值解法p158第四,我们可以使用欧拉公式来计算微分方程的近似解,并利用泰勒公式计算误差估计,从而求得可靠的解析解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮杰森

感谢支持,杰森会继续努力哒

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值