使用厄拉多塞筛法计算素数的和
来源:互联网 发布:常州市软件行业协会 编辑:程序博客网 时间:2024/06/05 16:11
求N以内所有素数的和,最普通的方法是对N以内所有自然数进行一次是否为素数的判断,然后将所有素数相加。
然而对某个自然数s是否为素数的判断是相当费时间的,需要判断其是否可以整除0到s^0.5之间的所有自然数,如果s很大的话,这将相当耗时。
两千多年前的数学家厄拉多塞提出的厄拉多塞筛法可以一定程度上减少计算素数和时的工作量。
维基百科上埃拉托斯特尼筛法词条中有一个很直观的示意图,如下:
例如现在要求自然数N以内所有素数的和,那么此筛法的基本方法是从2开始,把2作为素数,然后把N以内的所有2的倍数全部除去。此时下一个数字为3,将3作为素数,然后把N以内的所有3的倍数全部除去。下一个数字是5,把5作为素数,然后把N以内的所有5的倍数全部除去……一直这样下去,直到N^0.5,此时剩下的没有被除去的数全都是素数,把这些数和之前的所有素数相加即可得到结果。
这样的话,省掉了很复杂的判断某自然数是否为素数的过程。在N很大的时候,效率是秒杀开头提到的普通方法的。
代码如下:
#include "TimerCounter.h"#include "TimerCounter.cpp"#include <iostream>using namespace std;int main(){ uint64_t MAX; while(cin>>MAX) { TimerCounter tc; tc.Start();//计时开始 bool *isprime=new bool[MAX];//创建一个大小为MAX的bool类型数组 uint64_t primeSum=0;//创建一个uint64_t类型的变量用来存储素数的和 memset(isprime, true, MAX);//使用memset填充bool类型数组 for(uint64_t i = 2; i * i < MAX; ++i) { if(isprime[i]) { for(uint64_t j = i * i; j < MAX; j += i) isprime[j] = false; } } for(uint64_t i = 2; i < MAX; ++i) { if(isprime[i]) primeSum+=i; } delete[] isprime; tc.Stop();//计时结束 cout<<primeSum<<" ("<<tc.dbTime<<"s)"<<endl;//输出素数和,所用时间 } return 0;}测试这段代码,截图如下:
输入自然数N,输出N以内的所有素数的和,程序运行时间。
可以看到随着N的大小逐渐增大,时间的增长非常明显,可见该算法还是有一些缺点的。
0 0
- 使用厄拉多塞筛法计算素数的和
- 计算第n个素数到第m个素数之间所有的素数的和
- 随机生成三个数,计算其中素数的和
- 计算100以内的素数
- 使用欧拉筛法求素数和
- UPS的使用和计算
- 计算素数
- 素数的计算-埃氏筛法(区间素数利器)
- 计算100以内的素数的个数
- 高效的计算素数的算法--埃氏筛法
- 【并行计算】使用MPI实现简单的并行素数筛法
- 大数据与云计算笔记[三]:使用素数的RSA算法浅析
- C/C++编程小练习 计算10亿之内的素数和(合数筛选算法实现)
- 500以内质数(素数)的计算
- 计算素数的算法(一)
- 计算n以内的所有素数
- Eratosthenes筛计算N以内的素数
- 计算从[1,n]的素数个数
- 7.1线程2015/8/2
- 生产者消费者模式
- ios block回调实现方法
- 我和程序员打了13年交道后,为什么做了缘创派?
- 算法速成(7)图操作
- 使用厄拉多塞筛法计算素数的和
- C# I/O 助手类
- 银行卡输入自动断开 如1111 2222 3333 444
- 也谈 Euler Problem 13
- iOS Provisioning Profile(配置文件)与Code Signing详解
- CUint
- Redis 2种持久化模式的缺陷
- 宽带离网用户分析(3) 建模框架
- 关于使用github上开源类库 ios-ftp-server 的心得