C++ 这是埃拉托斯坦筛的有效代码吗?

C++ 这是埃拉托斯坦筛的有效代码吗?,c++,algorithm,primes,sieve-of-eratosthenes,C++,Algorithm,Primes,Sieve Of Eratosthenes,我最近学习了埃拉托斯提尼筛来寻找素数。了解了该方法后,我为其编写了此代码。 它是埃拉托色尼筛分的有效C++代码吗?< /强> < /P> #包括 使用名称空间std; int main() { int n; cin>>n; 布尔数组[n]; 对于(int i=2;iNo)。这不是Eratosthenes的筛选。Eratosthenes的筛选中没有除法(j%i==0)。代码给出正确的结果吗?这将是一个重要的第一次测试。布尔数组[n]在CPP中不是有效的,即使是,循环是不的,数组和向量使用零基索引。

我最近学习了埃拉托斯提尼筛来寻找素数。了解了该方法后,我为其编写了此代码。
<强>它是埃拉托色尼筛分的有效C++代码吗?< /强> < /P>
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
布尔数组[n];

对于(int i=2;iNo)。这不是Eratosthenes的筛选。Eratosthenes的筛选中没有除法(
j%i==0
)。

代码给出正确的结果吗?这将是一个重要的第一次测试。布尔数组[n]在CPP中不是有效的,即使是,循环是不的,数组和向量使用零基索引。您尝试运行它吗?是的,它给出正确的输出。不。如果您用警告编译它,您会看到<代码>数组< < /代码>的声明无效C++,因为C++没有可变长度数组,<代码> n< /代码>是一个变量。如果您解决了这个问题(或将编译器设置为允许VLA),您会遇到未定义的行为,因为您访问了
数组[n]
。否则,我认为您得到了正确的答案,但算法仍然是错误的。您会浪费时间划掉非素数的倍数,检查
j
,即使这无关紧要(这不会影响复杂性,但会让你变慢),并且将
j
增加1而不是
i
,这确实会影响复杂性。你能提供一个初学者容易理解的有效代码的参考吗?只需搜索互联网(如谷歌)如果你只需要工作代码而不想自己开发,请看@Suyashky:我在我的博客上推荐。
#include <iostream>
using namespace std;

int main()
{
int n;
cin>>n;
bool array[n];

for(int i=2;i<=n;i++)
{
    array[i]=true;
}

   for(int i=2;i<=n/2;i++)
   {
      for(int j=i+1;j<=n;j++)
      {
         if(array[j]==true)
         {
            if(j%i==0)
            array[j]=false;
         }
      }
   }

  for(int k=2;k<=n;k++)
  {
    if(array[k]==true)
    cout<<k<<" ";
  }
}