前回に引き続き第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の使いやすさがよくわかる練習問題であった。
コメント