スポンサーリンク

【基本情報技術者過去問】令和5年度科目Bの公開問題の問1をわかりやすく解説!

スポンサーリンク
基本情報技術者

基本情報技術者試験に合格するためには、過去問で慣れることがとても大切です。
ただ、最初は解説を見てもよくわからないものです。

そこで今回は、文系で応用情報技術者に合格している筆者が、令和5年度基本情報技術者試験科目B(アルゴリズム)の公開問題問1わかりやすく解説します。

ある程度できる方にとっては冗長な説明に感じるかもしれません。

問題

問題文を読もう

まず、「関数findPrimeNumbers引数で与えられた整数以下の全ての素数だけを格納した配列を返す関数」とあります。

だいご
だいご

「関数」ってなんだっけ?

関数というのは「一連の処理をひとまとめにしたもの」です。

例えば、お米を炊くときに「お米の量を計る」「お米を研ぐ」「水を入れる」「炊飯器にセットする」「炊飯器のボタンを押す」といった工程がありますが、これらを全部指示するのはめんどくさいですよね。

これらを全てまとめて「お米を炊く」という関数を作ります。
そうすると「お米を炊いて」と言うだけで先ほどの工程をやってくれるわけです。

指示の回数を減らすことができるわけですね。

問題文には「findPrimeNumbers()という関数は引数で与えられた整数以下…」とあります。

引数(ひきすう)というのは、関数を実行するときについでに与える情報のことです。
例えば、お米を炊く場合は「何合炊いてほしい」とか「~分で炊いてほしい」とかです。

この場合はfindPrimeNumbers()に2以上の整数を引数として与えると言っています。
つまり2,3,4….といった数字の情報を与えるわけです。

引数は関数の名前の後のカッコの中に書きます。この問題だとfindPrimeNumber(maxNum)なので、
この関数は与えられた数字、maxNum以下の素数を全て返す関数だということです。

例えば、この関数に6を引数(情報)として与えると2,3,5という素数の配列が返ってきます。
7を引数として与えると2,3,5,7という素数の配列が返ってきます。

プログラムを読む前に

プログラムを読む前に、どういった処理をしているのかを想像してみましょう。
この関数はざっくりいうと「素数を見つける」プログラムでした。

素数を見つけるにはどうしたらいいでしょうか。

だいご
だいご

いろんな数で割ってみて、割り切れなければいい」んですよね

きょうこ
きょうこ

その通りよ。逆に言えば「1個でも割りきれる数があればダメ」ってことね

よって、この関数には「いろんな数字で割ってみて余りを調べる」工程があるんだろうなーと予想できます。

これを念頭にして読んでいきましょう。

プログラムを読む

問題文を再喝します。

まず、大きなfor文があって、その中にさらにfor文があります。
いわゆる「入れ子構造」と呼ばれるものです。

最後にreturn pnListとあるので、最後はpnListが出力されます。
ということは、pnListに引数以下の素数が配列として入っていることになります

一番外側のfor文

次に、一番外側のfor文を見ていきましょう。

iを2からaまで1ずつ増やす(for文)
divideFlagにtrueを入れる
③(内側のfor文の処理)
divideFlagがtrueと等しいとき、pnList(素数が入る配列)にiを追加する

となっています。つまり、divideFlagがtrueのときに、iは素数になっているということです。
どうやら、divideFlagは「素数かどうか」を表しているようです。

ということはiは引数(maxNum)以下の数字全てが入るわけです。

整理すると、
maxNum以下の数字iの中で、divideFlag(素数かどうか)がtrueなものをpnListに入れているということです。

ということはi2から3,4,5…maxNumまで1ずつ増やして素数かどうか確認する必要があるため、for文の条件にあるaはmaxNumであるということです。

内側のfor文

ここまではiが素数のときにpnListに追加する過程でした。
では、「素数じゃない時に弾く」処理を内側のfor文で作る必要があります。

中のfor文を見てみましょう。

jを2から1ずつ増やす
b)のとき、divideFlagにfalseを入れてfor文のループを終了する

divideFlag「素数かどうか」を表していますよね。falseが入るということは「素数ではない」ということです。

前のループを思い出してください。

そもそも、このfor文はi素数じゃないものを弾く工程です。
つまり、(b)は「iが何かの数字で割り切れる」という条件が入ります。

よって選択肢としては「i ÷ jの余りが0と等しい」というのが入ります。

整理すると、

iが素数かどうか調べるのに、jを2から1ずつ増やしてその都度i割って確認しているということですね。

以上をまとめると、答えは  になります。

まとめ

基本情報技術者試験の過去問の令和5年度の科目Bの公開問題の問1をわかりやすく解説しました。

アルゴリズムは過去問などで慣れることがとても大切です。

ある程度数をこなすと早く解けるようになってくるので、やってみてください。

タイトルとURLをコピーしました