目前我正在开展一个项目,我想计算所有素数。 当我编译(MINGW Windows Comp。)时,程序崩溃并返回一个随机错误号。 这是我写的代码:
/*
Sieb des Eratosthenes
*/
#include <iostream>
#include <math.h>
using namespace std;
main()
{
//variablendeklaration
unsigned int nmax=100;
unsigned int i,j,erg;
bool prim[nmax];
//Initialisieren
prim[0]=false;
prim[1]=false;
//array prim[i] erstellen
for(i=2;i<nmax;i++)
{
prim[i]=true;
}
for(i=2;i<nmax;i++) //alle Primzahlen durchlaufen
{
if(prim[i] == true) //auf Prim prüfen
{
for(j=2;j<nmax;j++) //multiplizieren und wegstreichen
{
erg = j * i;
prim[erg] = false;
}
}
}
for(i=2;i<nmax;i++)
{
cout << prim[i] << endl;
}
}
答案 0 :(得分:1)
此时:
erg = j * i;
prim[erg] = false;
您将最终访问超出prim
的界限,因为i
和j
的值最多可以为nmax - 1
,因此{{1} }的最大值为erg
。您需要检查此情况并在(nmax - 1) * (nmax - 1)
时中断,例如
erg >= nmax
答案 1 :(得分:1)
解决此问题的另一种方法是避免循环中的额外步骤:
for(i=2; i < nmax; i++)
{
if(prim[i] == true)
{
for (j = 2 * i; j < nmax; j += i) // state j at 2i, increment by i
{
prim[j] = false;
}
}
}
这具有以下效果:1)不循环嵌套nmax
项(将总体复杂度从O(n ^ 2)降低到O(n *(n / 2 + n / 6 + n / 10 +) ...)实际上是O(n log n),2)不需要额外的边界检查,因为你在循环条件下永远不会超出界限。