高校数学をプログラミングで解く(コラム)「1-5 『情報』の試作問題「第3問」」
はじめに
この記事では、令和7年度の大学入学共通テスト(旧センター試験)で新たな受験科目となる『情報』について、独立行政法人大学入試センター(DNC)が出している『情報』の試作問題を扱います。
https://www.dnc.ac.jp/albums/abm.php?d=511&f=abm00003277.pdf&n=6-2-1_試作問題『情報Ⅰ』※令和4年12月23日一部修正.pdf
令和7年度以降に大学受験をされる方は、本記事をお読みになる前に、是非一度この試作問題を実際にやってみてください。
試作問題「第3問」
今回は、『情報』の試作問題の第3問について考えてみます。
「第3問」の概要
「第3問」は問1から問3までで構成されており、配点としては25点になります。
独立行政法人大学入試センター(DNC)の
「令和7年度試験の問題作成の方向性、試作問題等」( https://www.dnc.ac.jp/kyotsu/shiken_jouhou/r7/r7_kentoujoukyou/r7mondai.html )
のページに、『令和7年度大学入学共通テスト 試作問題「情報」の概要』(https://www.dnc.ac.jp/albums/abm.php?d=511&f=abm00003141.pdf&n=6-1_概要「情報」.pdf)という資料があります。この資料のp.7にこの第3問の概要がまとめられています(図1)。
図1に記載されている通り、第3問は基本的なアルゴリズムとプログラミングの基本に関する問題です。このような問題はアルゴリズム設計とプログラミング経験をたくさん積んでいるほど有利になると思います。逆に言えば、プログラミング経験が少ない人は難しく感じるかもしれません。
第3問 問1
空欄「ア」から順にみていきます。
まず、「ア」は枚数(46)の値を計算するだけなので、関数の意味さえ分かれば、小学生でも解けます。46円は10円硬貨4枚、5円硬貨1枚、1円硬貨1枚となるので、硬貨は計6枚となります。つまり、枚数(46)=6となります。
次に「イ」です。客が店に渡す硬貨の枚数は枚数(51)で計算され、店から客に返す釣り銭の枚数は枚数(5)で計算されますので、「51 円払って 5 円の釣り銭を受け取る払い方をした場合,客と店の間で交換される硬貨枚数の合計」は、枚数(51)+枚数(5) で計算されます。つまり、答えは⓪となります。
最後に「ウ」と「エ」です。これまでの話で、46円の商品を買うためにお金を5円多い51円支払って、5円の釣り銭を受け取っています。このとき、「客と店の間で交換される硬貨枚数の合計」は枚数(51)+枚数(5) で計算できました。これを一般化すると、$${x}$$円の商品を買うためにお金を$${y}$$円多い$${x+y}$$円支払って、$${y}$$円の釣り銭を受け取ることになります。したがって、「客と店の間で交換される硬貨枚数の合計」は枚数($${x+y}$$)+枚数($${y}$$) で計算できます。つまり、「ウ」と「エ」はそれぞれ②$${x+y}$$と①$${y}$$が入ります。
第3問 問2
空欄「オ」「カ」から順に見ていきます。
「オ」「カ」については、プログラミングの基礎的なことを知っている人には簡単でしょう。一般的なプログラミング言語では、整数値の商を求める演算を『/』で表すことが多いですが、この問題では『÷』という記号を使っています。これに注意すれば、46 円に対して 10 円玉が何枚まで使えるかは$${46 \div 10}$$ で、その際にいくら残るかは$${46 \ \% \ 10}$$で求めることができます。つまり、「オ」と「カ」はそれぞれ②$${46 \div 10}$$ と③$${46 \ \% \ 10}$$が入ります。
次に、「キ」「ク」「ケ」「コ」です。これらも「繰り返し処理」「配列」「代入」「加算」などのプログラミングの基礎的なことを知っている人にはそんなに難しくないと思います。ポイントは、問題文を読んで最小の硬貨枚数を計算するためのアルゴリズムまたは手順を素早くイメージできるかだと思います。
問題文中の図1(図2)に解答を記入してみました。これを見ながら解説します。
(1) Kouka = [1,5,10,50,100]
プログラムの1行目は、問題文中に記載されている『配列 Kouka に硬貨の額を低い順に設定している。なお,配列の添字は 0 から始まるものとする。最低額の硬貨が 1 円玉なので Kouka[0]の値は 1 となる』の部分をコードにした部分です。この文章の通り、Kouka[0]の値は 1、Kouka[1]の値は 5、Kouka[2]の値は 10、Kouka[3]の値は 50、Kouka[4]の値は 100 となります。(※配列については記事『高校数学をプログラミングで解く(準備編)「2-4 配列」』で解説していますので、こちらもご覧ください。)
(2) kingaku = 46
プログラムの2行目は、変数 kingaku に 46 を代入しています。問題文中の『ここでは例として目標の金額を 46 円としている』の部分に対応しています。
(3) maisu = 0, nokori = kingaku
プログラムの3行目は、問題文中に『変数 maisu に支払いに使う硬貨の枚数の合計が計算され,変数 nokori に残りいくら支払えばよいか,という残金が計算される』と説明されている、変数 maisu と変数 nokori の初期化を行っています。つまり、変数 maisu の値は最初 0 にしており、変数 nokori の値は最初 kingaku (ここでは 46 )と同じ値にしています。枚数と残金の計算をまだ行っていないので、これらの値は妥当なものです。
(4) i を 4から0まで1ずつ減らし ながら繰り返す:
(5) | maisu = maisu + nokori ÷ Kouka[i]
(6) ┗ nokori = nokori % Kouka[i]
プログラムの4~6行目は、繰り返し処理になっています。問題文中にも『高額の硬貨から何枚まで使えるかを計算する方針で,(4)~(6)行目のような繰返し文にした。』とありますね。そして、『この繰返しで,変数 maisu に支払いに使う硬貨の枚数の合計が計算され,変数 nokori に残りいくら支払えばよいか,という残金が計算される。』となっています。実際にそうなっていることを順番に見てみましょう。
処理① まず、プログラムの4行目で変数 i に 4 が与えられます。
処理② 次に、プログラムの5行目の処理が行われます。変数 i の値は 4 ですので、5行目の配列の要素 Kouka[i] は Kouka[4] すなわち 100 で与えられます。そして、変数 nokori の値は 46 なので、 nokori ÷ Kouka[i] は 46 ÷ 100 = 0 と計算されます。この値を変数 maisu に足すことになりますが、maisu は最初 0 なので、結局 maisu + nokori ÷ Kouka[i] は 0 となります。プログラムの5行目は、この値を変数 maisu に代入して変数 maisu の値を更新していますが、この段階では、変数 maisu の値は 0 のままです。
処理③ 今度は、プログラムの6行目の処理が行われます。この段階では、変数 i の値は 4 のままですので、6行目の配列の要素 Kouka[i] は Kouka[4] すなわち 100 のままになります。そして、変数 nokori の値は 46 なので、nokori % Kouka[i] は 46 % 100 = 46 と計算されます。プログラムの6行目は、この値を変数 nokori に代入して変数 nokori の値を更新していますが、この段階では、変数 nokori の値は実質変わらず 46 となります。
処理④ 処理③が終わると、プログラムの4行目に戻り、変数 i を 3 に更新します。そして、プログラムの5行目と6行目が実行されます。ただ、このとき配列の要素 Kouka[i] は Kouka[3] すなわち 50 ですので、処理②と処理③と同様の処理を行った結果として、変数 maisu の値は 0 のまま、変数 nokori の値は 46 のままとなります。
処理⑤ プログラムの4行目に戻り、変数 i を 2 に更新します。このとき配列の要素 Kouka[i] は Kouka[2] すなわち 10 になります。
処理⑥ プログラムの5行目の処理が行われます。変数 nokori の値は 46 なので、 nokori ÷ Kouka[i] は 46 ÷ 10 = 4 と計算されます。変数 maisu は 0 なので、 maisu + nokori ÷ Kouka[i] は 4 となります。プログラムの5行目は、この値を変数 maisu に代入して変数 maisu の値を 4 に更新します。
処理⑦ プログラムの6行目の処理が行われます。変数 nokori の値は 46 なので、nokori % Kouka[i] は 46 % 10 = 6 と計算されます。プログラムの6行目は、この値を変数 nokori に代入して変数 nokori の値を 6 に更新します。
処理⑧ プログラムの4行目に戻り、変数 i を 1 に更新します。このとき配列の要素 Kouka[i] は Kouka[1] すなわち 5 になります。
処理⑨ プログラムの5行目の処理が行われます。変数 nokori の値は 6 なので、 nokori ÷ Kouka[i] は 6 ÷ 5 = 1 と計算されます。変数 maisu は 4 なので、 maisu + nokori ÷ Kouka[i] は 5 となります。プログラムの5行目は、この値を変数 maisu に代入して変数 maisu の値を 5 に更新します。
処理⑩ プログラムの6行目の処理が行われます。変数 nokori の値は 6 なので、nokori % Kouka[i] は 6 % 5 = 1 と計算されます。プログラムの6行目は、この値を変数 nokori に代入して変数 nokori の値を 1 に更新します。
処理⑪ プログラムの4行目に戻り、変数 i を 0 に更新します。このとき配列の要素 Kouka[i] は Kouka[0] すなわち 1 になります。
処理⑫ プログラムの5行目の処理が行われます。変数 nokori の値は 1 なので、 nokori ÷ Kouka[i] は 1 ÷ 1 = 1 と計算されます。変数 maisu は 5 なので、 maisu + nokori ÷ Kouka[i] は 6 となります。プログラムの5行目は、この値を変数 maisu に代入して変数 maisu の値を 6 に更新します。
処理⑬ プログラムの6行目の処理が行われます。変数 nokori の値は 1 なので、nokori % Kouka[i] は 1 % 1 = 0 と計算されます。プログラムの6行目は、この値を変数 nokori に代入して変数 nokori の値を 0 に更新します。変数 i が 0 に達しているので、繰り返し処理はここで終わります。
(7) 表示する(maisu)
プログラムの7行目は、計算した硬貨枚数(変数 maisu に入っている値)を表示します。
第3問 問3
この問題も「条件分岐」「繰り返し処理」「代入」「加算」などのプログラミングの基礎的なことを知っている人にはそんなに難しくないです。ポイントは、やはりこの最小交換硬貨枚数を計算するためのアルゴリズムまたは手順を素早く理解できるかにかかっていると思います。
問題文中の図2(図3)に解答を記入してみました。これを見ながら解説します。
(1) kakaku = 46
プログラムの1行目は、変数 kakaku に 46 を代入しています。問題文中の『なお,ここでは例として商品の価格を 46 円としている。』の部分に対応しています。
(2) min_maisu = 100
プログラムの2行目は、問題文中の『min_maisu の初期値には,十分に大きな値として 100 を用いている。100 円以下の買い物では,使う硬貨の枚数は 100 枚を超えないからである。』との説明の通り、変数 min_maisu を 100 で初期化しています。
(3) tsuri を 0 から 99 まで1ずつ増やしながら繰り返す:
(4) | shiharai = kakaku + tsuri
(5) | maisu = 枚数(shiharai) + 枚数(tsuri)
(6) | もし maisu < min_maisu ならば:
(7) ┗┗ min_maisu = maisu
プログラムの3~7行目は、繰り返し処理になっています。問題文中の『このプログラムでは,先生(T)のアドバイスに従い,釣り銭無しの場合も含め,99 円までのすべての釣り銭に対し,その釣り銭になるように支払う場合 に交換される硬貨の枚数を求め,その最小値を最小交換硬貨枚数として計算している。』の部分になります。実際にそうなっていることを見てみます。3行目で変数 tsuri には最初 0 が与えられます。4行目で変数 shiharai には kakaku + tsuri = 46+0 = 46 が代入されます。5行目で関数「枚数(金額)」を用いて、支払った硬貨の枚数「枚数(shiharai)」と釣り銭の硬貨の枚数「枚数(tsuri)」とを計算し、それらの和を求めて、変数 maisu に代入しています。ここでは、枚数(shiharai) = 枚数(46) = 6 と 枚数(tsuri) = 枚数(0) = 0 となるので、変数 maisu には 6 + 0 = 6 が代入されます。6行目で maisu < min_maisu が成り立っているかを確認し、成り立っていれば7行目の処理を行います。ここでは、maisu = 6 、min_maisu = 100 で、maisu < min_maisu が成り立っているため、7行目の処理が実行され、変数 min_maisu は変数 maisu の値 6 で更新されます。
以降、プログラムの3行目で変数 tsuri を 1 から 99 まで1ずつ増やしながら更新して、変数 tsuri の値ごとにプログラムの4~7行目の処理を繰り返していきます。変数 tsuri が1から5まで更新される場合をみておきます。
変数 tsuri の値が 1 のとき、変数 shiharai は 47 となるので、変数 maisu は 7 + 1 = 8 となります。このとき maisu < min_maisu は 8 < 6 となって成り立たたないので、7行目は実行されません。
変数 tsuri の値が 2 のとき、変数 shiharai は 48 となるので、変数 maisu は 8 + 2 = 10 となります。このとき maisu < min_maisu は 10 < 6 となって成り立たたないので、7行目は実行されません。
変数 tsuri の値が 3 のとき、変数 shiharai は 49 となるので、変数 maisu は 9 + 3 = 12 となります。このとき maisu < min_maisu は 12 < 6 となって成り立たたないので、7行目は実行されません。
変数 tsuri の値が 4 のとき、変数 shiharai は 50 となるので、変数 maisu は 1 + 4 = 5 となります。このとき maisu < min_maisu は 5 < 6 となって成り立つので、7行目が実行され、変数 min_maisu は 5 に更新されます。
変数 tsuri の値が 5 のとき、変数 shiharai は 51 となるので、変数 maisu は 2 + 1 = 3 となります。このとき maisu < min_maisu は 3 < 5 となって成り立つので、7行目が実行され、変数 min_maisu は 3 に更新されます。
この後も、変数 tsuri が6から99まで更新されていきますが、この後は maisu < min_maisu が成り立つケースはなく、結局繰り返し処理後、 min_maisu は 3 となります。
(8) 表示する(min_maisu)
プログラムの8行目は、計算した最小交換硬貨枚数(変数 min_maisu に入っている値)を表示します。
まとめ
今回は、令和7年度の大学入学共通テスト(旧センター試験)で新たな受験科目となる『情報』について、独立行政法人大学入試センター(DNC)が出している『情報』の試作問題の第3問を考えてみました。
第3問は基本的なアルゴリズムとプログラミングの基本に関する問題です。
ある商品を買うときに釣り銭の枚数ができるだけ少なくなるように支払いをすることはよくやることですね。これを題材に問題が作成されています。ただ、このままだと少し問題が難しくなってしまうので、「客が支払う枚数と釣り銭を受け取る枚数の合計を最小にする払い方」を考える問題となっています。
アルゴリズムを考えてプログラミングするという経験を積んでいる人にはそんなに難しくない問題ですが、プログラミングをやってこなかった人には難しく感じたかもしれません。
難しく感じた方は是非この「高校数学をプログラミングで解く」を実践してみてください。少しずつアルゴリズム設計やプログラミングの知識が身についてくると思います。
参考文献
独立行政法人大学入試センター(DNC)のWebサイト
「令和7年度試験の問題作成の方向性、試作問題等」https://www.dnc.ac.jp/kyotsu/shiken_jouhou/r7/r7_kentoujoukyou/r7mondai.html
高等学校『情報I』数研出版、ISBN:9784410821219
この記事が気に入ったらサポートをしてみませんか?