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)
{

cout
std::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);