こんにちは､ お帰りなさい｡
もうひとつ､ 課題を与えたいと思ったんです｡
もちろん､ 今回はアレイについてです｡
配列の使い方､ 配列へのアクセス方法､ 配列の作り方を熟知してほしい｡
だから､ 3から100までのすべての素数を求めるcプログラムを書くべきだよ｡
そして､ それを非常に効率的に行う｡
そこで､ 配列を使わせるちょっとしたアルゴリズムを使いますが､
非常にシンプルなプログラムです｡
3から100までのすべての素数を出力として表示するだけです｡
そして､ 0から3をやらないのは､ それらをハードコーディングするためで､ とてもシンプルなことです｡
最初の2つ 最初の2つの素数は､ 0でない1と2です｡
つまり､ このプログラムには入力がなく､ 出力だけがあることになります｡
そして､ 出力は各素数をスペースで区切って1行で出力する予定です｡
かなり基本的なもので､ 100まであります｡
生成された各素数を格納する配列を作成する必要があります｡
最初の2つの素数､ つまり素数配列の2と3をハードコードすることができます｡
つまり､ 配列を作成し､ それをprimesと名付け､
そこに最初の2つをハードコードすることを想定しているのです｡
そして､ ハードコードすることも重要です｡
なぜなら､ これから素数を求めるために使うアルゴリズムは､ 他のどんな素数に対しても比較することになるからです｡
この課題ではループを活用して､ 100までの素数だけを見つけたい｡
だから､ すぐにでも､ 少なくとも､ 見つけた素数を表示するループを想定しておく必要がある｡
つまり､ プログラムの最後にある､ 素数配列を調べてその中にあるものをすべて表示するループが､
おそらくエンディングループになるのでしょう｡
100までのすべての素数を求める場合､
配列のサイズを50以上にする必要はないでしょう｡
100までのすべての素数が50以上あるとは思えないからです｡
だから､ 素数配列を作るときは､ サイズを100にすればいいんです｡
だから､ 最後にそれらをプリントアウトするループが絶対に必要です｡
の場合､ 素数を求めるために別のループが必要になります｡
素数はどんなアルゴリズムでも求めることができますが､ 私ならこのようなものを使います｡
このアルゴリズムを使うなら､ 配列を使う理由の方が多いからです｡
そこで､ 素数を見分ける基準として､
ある数が他の過去の素数で均等に割り切れない場合に素数とみなすことができる｡
また､ そのアルゴリズムにはもっと多くのものがありますが､
これが出発点です｡
また､ ある一定の数値までしか調べないようにしたい｡
そこで､ 一番内側のループのx条件として､ 次のようなものを使うことができます｡
ここで必要なのは､ おそらく2つのループです｡
一番下の3番目のループがデータをプリントアウトすることは既に述べましたが､
この課題では2つのループが必要です｡
そして､ ここでお話ししているアルゴリズムは､ さらに改良されたものです｡
だからこそ､ やりたいことがあるんですね｡
なぜなら､ 代入の目的は素数を理解することではなく､
配列の使い方を理解することだからです｡
過去に生成された素数を見ると､ 配列を使わざるを得ないので､
先ほど言ったように､ 生成された素数ごとに保存することになります｡
そして､ もうひとつ､ さらに最適化する方法として､ 偶数には目を向けないということです｡
つまり､ 3から100までの数字を調べて､ それが素数かどうかをチェックする場合､
偶数は無視してもいいのです｡ 偶数は決して素数にはならないからです｡
ですから､ 一番外側のループや一番外側のループで､
素数が他の素数で割り切れるかどうかをチェックしたり､ 割り切れないことを確認してスキップしたりすることができます｡
そして､ この一番内側のループのもう一つの軸の条件は､
pの値が素数の平方根を超えないようにすることで､ これはアルゴリズムの他の部分です｡
だから､ これは完全な意味ではないかもしれませんが､ 基本的にはこれらの基準に従ってほしいのです｡
偶数のチェックをスキップして､ 過去に生成された素数を探すアルゴリズムと､
pが素数の平方根を超えないかどうかも素数チェックの方法だからです｡
そのため､ 基本的に5から100まで続くforループを用意し､
それを2ずつ増やして奇数だけを探すようにする必要があります｡
そして､ 内側のforループで､ 1から､ pをprime
sub-Iで割った値がprime sub-Iと等しくなるまでの間､ 実行することになります｡
そして､ その数字が素数でないことも確認したいところでしょう｡
つまり､ あるチェックを超えないようにし､ さらに実際に素数が見つかったらインナーループから飛び出すようにしたいわけです｡
そして､ 現在の数が以前のいずれかの素数で割り切れるかどうかを調べるには､
素数の配列を見ればいいわけです｡
そして､ そのモジュラスが0に等しければ､ 素数は存在しないことになる｡
そうでなければ､ このループ全体でチェックを行い､
素数サブIが素数サブIより大きい平方根の問題をすでに超えていて､
実際に素数が見つからなかった場合､ その素数を素数配列に追加し､
素数配列をプリントアウトすればいいことになります｡
だから､ 実際のアルゴリズムは､ 私が作っているほど混乱はしていないようです｡
ここでも､ 内側のforループの外側のforループで､ できるだけ多くの疑似コードのヒントを与えるようにします｡
しかし､ 配列にアクセスしたり､ 配列を読んだり､
配列を見て以前の値を確認したりする必要が出てきます｡
配列に本当に詳しくなれますよ｡
では､ 頑張ってください｡ 次回の講義で､ もっと意味のある解決策を提供しますが､
以上が要件といくつかのヒケツです｡
ありがとうございます｡