请输出 2^32 以内的所有素数

本文探讨了在大数据环境下如何使用线性筛和厄拉多塞筛法寻找素数,通过bitset替代数组减少内存消耗。作者分享了使用bitset存储结果并以文件形式输出,借助010Editor打开超大文件的方法。同时,通过O3优化和快速输出提升程序效率,最终实现5分钟内完成计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看到这么大的数据量,首先想到线性筛(欧拉筛)

但是线性筛需要开长度为 n 的 long long 数组,显然开不下......

于是,退而求其次选择厄拉多塞筛法

bool 数组用 bitset 代替,因为一个 bool 占 1byte=8bit

而 bitset 的一位只占 1bit (用法上几乎无区别)

采用文件输出:

freopen("result.txt","w",stdout);

将结果全部输入到 result.txt 文件当中(位置就是在程序所在文件夹中)

再加上快速输出和O3优化以提高程序运行效率

基本上5分钟就可以跑出来啦~~

Code

#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll Max=(1ll<<32),sqrtMax=(1ll<<16);
bitset<Max+10> vis;
inline void write(ll x){ //快速输出 
	if(x<0){
		x=~x+1;
		putchar('-');
	}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
void Prime(){ 
    for(ll i=2;i<=Max;++i){  
        if(!vis[i]){//说明是素数 
        	write(i);putchar('\n');
        	if(i>sqrtMax)continue;
        	for(ll j=i*i;j<=Max;j+=i)vis[j]=1;
		}
    }
}
int main(){
	freopen("result.txt","w",stdout);
	Prime();
	return 0;
}

运行结果

由于最后的得到的文件过大,直接点是打不开的

必须使用一些专业的软件才能打开,这里贴上一个 010Editor 的安装包

https://wwu.lanzouy.com/idvNr0br5p1a
密码:4weh

安装好后,打开010Editor,然后将result.txt 拖进去即可打开

[End]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值