マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第11章 マルチスレッドプログラミング

第2話 素数生成プログラムを組むにはどうしたらよいの?


2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

生成された素数の個数は25です。
素数生成時間は0.002秒です。


このプログラムを組みときの考え方を説明します。

1は素数でないことは約束事ですので、

探索は2から始めます。

最初は図のように2から100までの素数を生成するプログラムを考えます。

for文で2から100までの整数を発生させて素数である場合にコンソール画面に打ち出すようにします。

図のように素数と素数の間には半角スベースを入れてください。

入れないと全部繋がって2345711・・・のように表示されてどれが素数なのかわかりません。

さて、素数判定はどうしたらよいでしょうか。

例えば、61が素数か合成数

(素数でない数を合成数と呼びます。理由は素数でない数は必ず素数の積で表せるからです)

を判定するにはどうしたらよいでしょうか。

まず、

int 素数判定(int x);//素数判定関数

を用意しましょう。

int型にしてある理由は、素数のときには1を返し合成数のときには0を返すようにしたいからです。

2と3については無条件に1を返すことにして、

4以上の整数について素数であるか合成数であるかを判定することにしましょう。

素数とは1と自分自身でしか割り切れない数のことです。

61ならこれを割り切れる整数は1と61しかないので、

素数です。

57は3で割り切れてしまうので合成数です。

では61のときはいくつまで割ればよいでしょうか。

61の平方根は7.8102・・・です。

ですから7まで割っていけばよいのです。

偶数は2で割り切れてしまうので2以外の偶数は文句なしに合成数です。

つまり、2で割り切れてしまうものは文句なしに合成数です。

ですから、このときは0を返します。

ですから、61が素数であるかどうかは、

3,5,7

で割って割り切れなければ素数と判定できます。

7までで十分なのは8×8=64であるからです。

つまり、5以上の整数については偶数のときつまり2で割り切れてしまう場合には素数判定関数は0を返します。

奇数についてはxの平方根以下まで3以上の奇数で割って割り切れてしまえばやはり0を返します。

最後まで割り切れなければ1を返します。

for文で2から100までの整数を発生させて素数判定関数による判定が1のときにみにコンソールに表示させれば、

素数生成に成功します。

では、以上の説明を参考にして



2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

生成された素数の個数は25です。
素数生成時間は0.002秒です。


を実現するプログラム例を考えてください。





第11章第1話へ 第11章3話へ

本講義トップへ