[英]Why is my sieve of Eratosthenes code looping infinitely. I have tested with a few numbers
我正在尝试通过以下伪代码在C ++中实现Eratosthenes算法的筛网:
输入:n> 1的整数。
假设A为布尔值数组,由2到n的整数索引,最初都设置为true。
对于i = 2,3,4,...,不超过√n:如果A [i]为真:对于j = i2,i2 + i,i2 + 2i,i2 + 3i,...,不超过n :A [j]:=假。
输出:所有使A [i]为真的i。
但是我的代码在最后一个for循环中无限循环,我不知道为什么。
void primes(int n)
{
bool numArr[n];
for (int a=2;a<n;a++)
{
numArr[a]=true;
}
int k,j, m = int(sqrt(n));
for(int i=2;i<m;i++)
{
k=0;
if(numArr[i]==true)
{
for(j=i^2;j<n;j+(k*i))
{
numArr[j]=false;
k++;
}
}
}
for(int j=1;j<n;j++)
{
if(numArr[j]==true)
{
cout<<numArr[j]<<endl;
}
}
}
首先,C ++中没有VLA。 但是,有些编译器会容忍它们,而另一些则不会。 对于便携式解决方案, std::vector
效果很好。 以此替换您的VLA:
std::vector<bool> numArr(n);
您甚至可以在其中进行初始化。 不需要将所有内容都设置为true
循环,只需将numArr(n)
更改为numArr(n, true)
为您完成。
但是,您的主要问题在这里:
for(j=i^2;j<n;j+(k*i))
j=i^2
不执行您认为的操作,并且j+(k*i)
增量不会增加任何值。 实际上, k
部分没有任何意义。 改为这样做:
for (j = i*i; j < n; j += i)
您打印的cout<<numArr[j]<<endl;
也是错的。 numArr[j]
是bool
,因此每次将打印1
。 您肯定要打印j
而不是numArr[j]
。
尽管这不是问题,但您不必编写if (numArr[i] == true)
。 只需执行if (numArr[i])
。 numArr[i]
已经是bool
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.