【问题标题】:Sieve of Eratosthenes C++ codeEratosthenes C++ 代码筛选
【发布时间】:2014-05-24 16:12:25
【问题描述】:

我对编程还很陌生,我刚开始使用 C++

我发现了这个问题,它涉及生成直到“n”的所有素数。这是我的代码,我假设“n”为 10。我已经尽力了。如果你们能告诉我出了什么问题,我将不胜感激。

单独块引用中的 for 循环无限重复,这意味着 i 的值没有被更新。我使用 cout 语句打印值,它不是 0 就是 1。为什么会这样?是不是逻辑有问题?

#include<iostream> 
#include<cstdlib>

using namespace std;

int main()
{
    int NumList[10], flag[10];
    int i,j;


    for(i = 0; i<10; i++) //Generate a list of numbers from 1 to 10
        NumList[i] = i+1;



    for(i = 0; i<10; i++) // Create a flag array, initialized to 1
        flag[i] = 1;

    for(i=1; i<10; i++)
    {
     if(NumList[i]%2==0)  // Mark all even numbers in the list
        flag[i] = 0;      // since they're not prime
    }
    for(i = 2; i<10; i++)        //Start from 3
{
        if(flag[i]==1)      // Check which numbers are left over
    {
        for(j = NumList[i]-1;j<10; ) //Since index = value-1 in this case
        {
            j+= NumList[i];     //Keep incrementing by value and marking in flag[]
            flag[j] = 0;
        }
    }
}

}

【问题讨论】:

  • 首先,您的代码看起来像是要消除 2 作为非素数。
  • 我知道。我将在输出期间添加一个 2。这样做似乎更简单。
  • 为什么不你告诉我们出了什么问题,也许我们可以解释为什么错了。
  • 我检查过了。它进入了一个无限循环。我不知道为什么。
  • 不...因为您在当前循环迭代完成之前访问越界。即你访问越界,然后然后检查j是否

标签: c++ primes sieve-of-eratosthenes


【解决方案1】:

代码无限循环,因为你在下面的循环中访问了越界

for(j = NumList[i] - 1; j<10; )
{
    j += NumList[i];
    flag[j] = 0;
}

假设 Numlist[i] 在您的外循环中 i = 2 时为 3,并且 j 在您的内循环中从 2 开始,会发生以下情况:

j takes value 2+3, flag[5] is assigned the value 0, current loop ends check 5 < 10
j takes value 5+3, flag[8] is assigned the value 0, current loop ends check 8 < 10
j takes value 8+3, flag[11] is assigned the value 0, current loop ends check 11 < 10

一旦第三个循环结束(修改了 flag[11]),所有关于接下来会发生什么的赌注都被取消了。事实上,您可能正在破坏您定义的其他一些变量,这些变量位于 flag[11] 引用的地址。

至于让这个问题消失,对你当前的逻辑干扰最小(不管它是什么 - 它看起来不正确)你可以增加标志数组的大小。

【讨论】:

  • 感谢您的解释。不过,逻辑是正确的。我得到了想要的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多