【问题标题】:Is it a valid code for Sieve of Eratosthenes? [closed]它是 Eratosthenes 筛的有效代码吗? [关闭]
【发布时间】:2018-07-17 15:32:07
【问题描述】:

我最近学习了埃拉托色尼筛法来寻找素数。在知道方法后,我为它编写了这段代码。
它会是埃拉托色尼筛法的有效 C++ 代码吗?

#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<<" ";
  }
}

感谢您的帮助!

【问题讨论】:

  • 代码是否给出了正确的结果?这将是一个重要的第一次测试。
  • bool array[n] 在 cpp 中是无效的,即使是这样,您的循环也是
  • 不,数组和向量使用从零开始的索引。你试过运行它吗?
  • 是的,它给出了正确的输出。
  • 没有。如果您在编译时出现警告,您会发现 array 的声明不是有效的 C++,因为 C++ 没有可变长度数组,而 n 是一个变量。如果您修复该问题(或将编译器设置为允许 VLA),您会遇到未定义的行为,因为您访问的是 array[n]。否则,我认为你得到了正确的答案,但算法仍然是错误的。您浪费时间划掉非素数的倍数,检查j,即使它无关紧要(这不会影响复杂性但会减慢您的速度),并将j 增加1 而不是@987654327 @,确实会影响复杂性。

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


【解决方案1】:

没有。这不是埃拉托色尼筛法。埃拉托色尼筛中没有分裂 (j % i == 0)。

【讨论】:

  • 能否提供一个有效代码的参考,初学者容易理解?
  • 如果您只需要工作代码而不想自己开发,只需搜索互联网(例如 Google)即可
  • @Suyashky:我在我的博客上推荐this essay。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多