【发布时间】: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