C++ Eratosthenes筛-从向量中去除非素数

C++ Eratosthenes筛-从向量中去除非素数,c++,sieve-of-eratosthenes,C++,Sieve Of Eratosthenes,我正在努力使该计划发挥作用: int main() { // prompt user for max number // ... // generate vector containing all numbers from 2 up to max // ... // give value 1 to not-prime numbers // ... // remove all not-prime numbers with value 1

我正在努力使该计划发挥作用:

int main()
{
    // prompt user for max number
    // ...

    // generate vector containing all numbers from 2 up to max
    // ...

    // give value 1 to not-prime numbers
    // ...

    // remove all not-prime numbers with value 1
    // ...

    // print out all numbers (all remaining are prime)
    // ...
}
一切都很好,除了需要识别素数并将其值更改为1的步骤。我什么都试过了,我真的没有主意了。下面是我对这段代码的最后一个想法:

// give value 1 to not-prime numbers
for (int i = 2; i < int(sqrt(max)); i++)
{
    for (int j = 0; j < numbers.size(); j++)
    {
        numbers[numbers[j] * i - 2] = 1;
    }
}
//给非素数赋值1
对于(int i=2;i

,显然它不起作用。救命啊

您应该显示更多代码,以便我们使用您的工具。例如,
数字的类型是什么?如果你真的在使用C++,它可能是代码> STD::数组或<代码> STD::vector < /代码>。为了方便起见,我假设您想要使用
std::vector
。另外,您不应该像这样使用C样式强制转换:
int(sqrt(max))

因此,以下是我应该做的:
首先,创建一个布尔向量,其每个索引从
0
max
。索引表示筛选中的数字,布尔值指出该数字是否为素数。首先,您需要假设所有的数字都是素数,因此使用
true
初始化向量

std::vector<bool> sieve(max+1, true); // Sets every value to true
然后,您需要继续使用sieve算法

int limit = static_cast<int>(sqrt(max));
for (int i = 2; i < limit; ++i)
{
    // If i is a prime, proceed with multiples
    if (sieve[i])
    {
        // Here, i*j is a multiple of i, hence not a prime (except when j = 1)
        for (int j = 2; i*j <= max; ++j)
        {
            sieve[i*j] = false;
        }
    }
}
int limit=static_cast(sqrt(max));
对于(int i=2;i对于(int j=2;i*j我假设数字是一个向量,包含从2到max的数字(数字[0]=2)

您的循环应该是:

// give value 1 to not-prime numbers
for (int i = 2; i < int(sqrt(max)); i++) // ok i are true numbers starting at 2
{
    for (int j = (i * i) - 2; j < numbers.size(); j + = i) // j are indices for numbers starting at i * i (i*j for j< i already seen) stepping by i
    {
        numbers[j] = 1; // as j as indices do it directly
    }
}
//给非素数赋值1
对于(int i=2;i
还可以写些什么:

// give value 1 to not-prime numbers
for (int i = 2; i < int(sqrt(max)); i++) // ok i are true numbers starting at 2
{
    for (int 0 = (i * i); j < max; j + = i) // j are true numbers starting at i * i (i*j for j< i already seen) stepping by i
    {
        numbers[j] = 1; // index for j is j-2
    }
}
//给非素数赋值1
对于(int i=2;i
不确定我是否在跟踪您,在中,您首先假设所有数字都是素数,并丢弃发现为非素数的数字。此外,为了更有效地编写代码,如果数字[I],则需要终止内部循环的if条件不是素数吗?你说你把非素数设为1,然后你说你想把素数设为1…这是什么?:)我想消除所有的非素数,这只是一些不成功的尝试,向你展示我的想法。这很有效,并且给所有的非素数赋予了正确的值1。谢谢!
// give value 1 to not-prime numbers
for (int i = 2; i < int(sqrt(max)); i++) // ok i are true numbers starting at 2
{
    for (int j = (i * i) - 2; j < numbers.size(); j + = i) // j are indices for numbers starting at i * i (i*j for j< i already seen) stepping by i
    {
        numbers[j] = 1; // as j as indices do it directly
    }
}
// give value 1 to not-prime numbers
for (int i = 2; i < int(sqrt(max)); i++) // ok i are true numbers starting at 2
{
    for (int 0 = (i * i); j < max; j + = i) // j are true numbers starting at i * i (i*j for j< i already seen) stepping by i
    {
        numbers[j] = 1; // index for j is j-2
    }
}