第4章 練習問題11

  • 投稿日:
  • by
  • カテゴリ:

 前回に引き続き第4章の練習問題。練習問題11を引用する。

 1~100の素数を全て見つけ出すプログラムを作成する。そのための方法の1つは、素数が順番に配列されたvectorを使用して、数字が素数かどうかをチェックする関数を記述することだ。つまり、このventorがprimesという名前であるとすればprimes[0]==2、primes[1]==3、primes[2]==5などを使用して、数字がそれよりも小さい素数で割りきれるかをチェックする。次に、1~100の各数字が素数かどうかをチェックし、検出された素数をvetorに格納するループを記述する。また検出された素数を一覧表示する別のループも記述する。素数のvecorをprimesと比較することで、結果をチェックするといいだろう。最初の素数は、2である。

 私の回答は、下記の通り。

#include "../../std_lib_facilities.h"

int main() {
    vector<int> primes;

    primes.push_back(2);

    for (int n = 3; n<=100; ++n) {
        int i;
        for (i = 0; i<primes.size(); ++i) {
            if (n % primes[i] == 0)
                break;
        }
        if (i >= primes.size())
            primes.push_back(n);
           
    }

    cout << "1~100の素数は\n"  ;

    for (int n: primes)
        cout << n << "\n";

    return 0;

}

 これは、明らかに間違ってる。問題文に「数字が素数かどうかをチェックする関数を記述する」とあるのに、メインルーチンだけで書いてしまっているからだ。しかも、素数判定のforループで、素数かどうかをforループを抜けた後のループ変数iの値で判定するため、ループ変数iの宣言をforループの外でやるとか、トリッキーなことをしている。素直に、回答例http://www.stroustrup.com/Programming/Solutions/Ch4/e4-11.cppのように、すべきであった。
 vectorの使いやすさがよくわかる練習問題であった。