C++ 用向量创建筛子
我试着用向量做一个简单的筛子:C++ 用向量创建筛子,c++,vector,sieve,C++,Vector,Sieve,我试着用向量做一个简单的筛子: #include<iostream> #include<vector> #include<cmath> using namespace std; vector<int> myVector; void vec_sieve() { myVector.push_back(0); myVector.push_back(0); unsigned int sz = pow(2,31); fo
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
vector<int> myVector;
void vec_sieve()
{
myVector.push_back(0);
myVector.push_back(0);
unsigned int sz = pow(2,31);
for(unsigned int i=2;i<sz;i++)
{
myVector.push_back(1);
}
int len = sqrt(sz);
for(unsigned int i=2;i<=len;i++)
{
if(myVector[i] == 1)
{
for(unsigned int j=2;i*j<=sz;j++)
{
myVector[i*j] = 0;
}
}
}
}
int main()
{
vec_sieve();
int n;
cin>>n;
unsigned int input;
for(int i=0;i<n;i++)
{
cin>>input;
if(myVector[input] == 1)
{
cout<<"Prime"<<endl;
}
else
{
cout<<"Not Prime"<<endl;
}
}
return 0;
}
#包括
#包括
#包括
使用名称空间std;
向量myVector;
void vec_筛()
{
myVector.push_back(0);
myVector.push_back(0);
无符号整数sz=pow(2,31);
对于(无符号整数i=2;输入;
如果(myVector[输入]==1)
{
coutstd::bad_alloc
可能被抛出,因为您试图在虚拟内存中分配一个连续内存块,该内存块太大,无法容纳其任何“间隙”
2^31乘以4字节(int的大小)是8GB。在调整数组大小时,您应该首先考虑“它分配了多少内存”。
此外,bool足以包含1和0。vector
进一步优化内存
与代码相关的一些其他观察结果:
与此相反:
for(unsigned int i=2;i<sz;i++)
{
myVector.push_back(1);
}
请遵循这一点,这将有助于提高您的内容质量,但我的输入限制将高达10^31。因此,您可以告诉我如何使用筛来处理这种长类型的输入。感谢uI无法想象为什么需要使用如此大的值。即使预计算也会持续数秒。
for(unsigned int i=2;i<sz;i++)
{
myVector.push_back(1);
}
myVector.resize (sz, 1);