Sieve of Eratosthenesアルゴリズムを実装したいと思います。前のリンクで提供されている擬似コードは、エラトステネスアルゴリズムのふるいを実装する方法
Input: an integer n > 1
Let A be an array of Boolean values, indexed by integers 2 to n,
initially all set to true.
for i = 2, 3, 4, ..., not exceeding √n:
if A[i] is true:
for j = i^2, i^2+i, i^2+2i, i^2+3i, ..., not exceeding n :
A[j] := false
Output: all i such that A[i] is true.
です。最初の問題はインデックスを扱うことです。私が単純にしたのは、簡単にするためにインデックスをデータの場所と照合することです。次の図はこの問題を示しています。
私のコードは、前述のアルゴリズムに従って素数を生成していません。私のコードは、正しい答えが得られていないのはなぜこれが私の実装
#include <iostream>
#include <vector>
#include <cmath>
int main()
{
int n(30);
std::vector<bool> A;
for(int i(2); i <= n+2; ++i)
A.push_back(true);
for (int i(2); i <= sqrt(n); ++i){
if (A[i] == true){
int a(0);
for ( int j(i*i); j <= n; j += a*i){
A[j] = false;
++a;
}
}
}
for (int i(2); i < A.size(); ++i){
if (A[i] == true)
std::cout << i << " ";
}
std::cout << std::endl;
return 0;
}
結果は
2 3 5 7 8 11 13 14 15 17 19 20 21 22 23 26 28 29
ですか?何かヒント?
アルゴの最も内側のループでは、段差は一定です。一番内側のループにはステップが増えています。 – Mat
@Mat、それはなぜ定数ですか?この行「i^2、i^2 + i、i^2 + 2i、i^2 + 3i」によれば、「i」は増加する変数によって乗算される。 – CroCo
すべての警告とデバッグ情報でコンパイルします( 'g ++ -Wall -Wextra -g')。デバッガ**( 'gdb')を使用してプログラムをステップバイステップで実行し、プログラムの状態を問い合わせます。 –