問題文全文(内容文):
次の生徒(S)と先生(T)の会話文を読み、空欄〔ア〕に当てはまる数字をマークせよ。
また、空欄〔イ〕〜〔エ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ウ〕・〔エ〕は解答の順序は問わない
S:この前、お客さんが460円の商品を買うのに、510円を払って、釣り銭を50円受け取っていたのを見て、授業で勉強したプログラミングで、そんな「上手な払い方」を計算するプログラムを作ってみたいなと思いました。
T:いいですね。「上手な払い方」とは何を考える必要がありますね。
S:普通は手持ちの硬貨の枚数を少なくするような払い方でしょうか。
T:そうですね。ただ、ここでは、客が支払う枚数と釣り銭を受け取る枚数の合計を最小にする払い方を考えてみませんか?客も店も十分な枚数の効果を持っていると仮定しましょう。計算を簡単にするために、100円以下の買い物とし、使う硬貨は1円玉、5円玉、10円玉、50円玉、100円玉のみで500円玉は使わない場合を考えてみましょう。
例えば、46円をちょうど支払う場合、支払い枚数はどうなりますか?
S:46円を支払うには、10円玉4枚、5円玉1枚、1円玉1枚という6枚で払い方が最小の枚数になります。
T:そうですね。一方、同じ46円を支払うのに、51円を支払って釣り銭5円受け取る払い方では、支払いに2枚、釣り銭に1枚で、合計3枚の硬貨のやりとりになります。こうすると交換する硬貨の枚数の合計が最小になりますね。
S:これが上手な払い方ですね。
T:そうです。このように、客と店員が交換する硬貨の合計が最小となる枚数、すなわち「最小交換硬貨枚数」の計算を考えましょう。
S:どうやって考えればいいかなぁ。
T:ここでは、次の関数のプログラムを作り、それを使う方法を考えてみましょう。目標の金額を釣り銭無くちょうど支払うために必要な最小の硬貨枚数を求める関数です。
【関数の説明と例】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
例:8円は「5円玉が1枚と1円玉が3枚」の組合せで最小の硬貨枚数になるので、枚数(8)の値は4となる。
これは、例えば、枚数(46)=〔ア〕 と計算してくれるような関数です。これを使って最小交換硬貨枚数の計算を考えてみましょう。例えば、46円を支払うのに、51円払って5円の釣り銭を受け取る払い方をした場合、客と店員の間で交換される硬貨枚数の合計は、この関数を使うと、どのように計算できますか?
S:〔イ〕で求められますね。
T:一般に、商品の価格x円に対して釣り銭y円を0,1,2,・・・と変化させて、それぞれの場合に必要な硬貨の枚数の合計を
枚数(〔ウ〕)+枚数(〔エ〕)と計算し、一番小さな値を最小交換硬貨枚数とすればよいのです。
S:なるほど。それで、釣り銭yはいくらまで調べればよいでしょうか?
T:面白い数字パズルですね。まあ、詳しくは今度考えるとして、今回は100円以下の商品なのでyは99まで調べれば十分でしょう。
【イの解答群】
⓪ 枚数(51)+枚数(5)
① 枚数(46)+枚数(5)
② 枚数(51)−枚数(5)
③ 枚数(46)−枚数(5)
【ウ・エの解答群】
⓪ x
① y
② x+y
③ x−y
問2
次の文章の空欄〔オ〕〜〔コ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。
S:まずは、関数「枚数(金額)」のプログラムを作るために、与えられた金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみます。もう少しヒントが欲しいなぁ。
T:金額に対して、高額の硬貨から使うように考えて枚数と残金を計算していくとよいでしょう。また、金額に対して、ある額の硬貨が何枚まで使えて、残金がいくらになるかを計算するには、整数値の商を求める演算「÷」とその余りを求める演算「%」が使えるでしょう。例えば、46円に対して10円玉が何枚まで使えるかは〔オ〕で、その際にいくら残るかは〔カ〕で求めることができますね。
S:なるほど!あとは自分でできそうです。
Sさんは、先生(T)との会話からヒントを得て、変数 kingaku に与えられた目標の金額(100円以下)に対し、その金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみた(図1)。ここでは例として目標の金額を46円としている。
配列 kouka に硬貨の単位を小さい順に設定している。なお、配列の添え字は0から始まるものとする。最低額の硬貨が1円玉なのでkouka[0]の値は1となる。
先生(T)のヒントに従い、高額の硬貨から何枚まで使えるかを計算する方針で、(4)〜(6)行目のような繰り返し文にした。この繰り返しで、変数 maisu に支払う硬貨の枚数の合計が計算され、変数 nokori に残りいくら支払えればよいか、という残金が計算される。
実行してみると〔ア〕が表示されたので、正しく計算できていることが分かる。いろいろな例で試してみたが、すべて正しく計算できていることを確認できた。
(図1)目標の金額ちょうどになる最小の硬貨枚数を計算するプログラム
(1) kouka = [1,5,10,50,100]
(2) kingaku = 46
(3) maisu = 0, nokori = kingaku
(4) 〔i〕を 〔キ〕 ながら繰り返す:
(5) maisu = 〔ク〕 + 〔ケ〕
(6) nokori = 〔コ〕
(7) 表示する(maisu)
【オ・カの解答群】
⓪ 46 ÷ 10 + 1
① 46 % 10 − 1
② 46 ÷ 10
③ 46 % 10
【キの解答群】
⓪ 5から1まで1ずつ減らし
① 4から0まで1ずつ減らし
② 0から4まで1ずつ増やし
③ 1から5まで1ずつ増やし
【クの解答群】
⓪ 1
① maisu
② i
③ nokori
【ケ・コの解答群】
⓪ nokori ÷ Kouka[i]
① nokori % Kouka[i]
② maisu ÷ Kouka[i]
③ maisu % Kouka[i]
問3
次の文章を参考に、図2のプログラムの空欄〔サ〕〜〔タ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ス〕・〔セ〕は解答の順序は問わない。
T:プログラム(図1)ができたようですね。それを使えば、関数「枚数(金額)」のプログラムができます。関数の引数として与えられる金額の値をプログラム(図1)の変数 kingaku に設定し、(7)行目の代わりに変数 maisu の値を関数の戻り値とすれば、関数「枚数(金額)」のプログラムとなります。では、その関数を使って最小交換硬貨枚数を計算するプログラムを作ってみましょう。ここでも、100円以下の買い物として考えてみます。
【関数の説明(再掲)】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
Sさんは、図2のようなプログラムを作成した。変数 kakaku に与えられる商品の価格に対して、釣り銭を変数 tsuri を用意し、妥当な tsuri のすべての値に対して交換する硬貨の枚数を調べ、その最小値を求めるプログラムである。なお、ここでは例として商品の価格を46円としている。
このプログラムでは、先生(T)のアドバイスに従い、釣り銭無しの場合も含め、99円までのすべての釣り銭に対し、その釣り銭になるように支払う場合に交換される硬貨の枚数を求め、その最小値を最小交換硬貨枚数として計算している。
最小値の計算では、これまでの払い方での最小枚数を変数 min_maisu に記憶しておき、それより少ない枚数の払い方が出るたびに更新している。min_maisuの初期値には、十分大きな値として100を用いている。100円以下の買い物では、使う硬貨の枚数は100枚を超えないからである。
(図2)最小交換硬貨枚数を求めるプログラム
(1) kakaku = 46
(2) min_maisu = 100
(3) 〔サ〕を 〔ジ〕 から 99 まで1ずつ増やしながら繰り返す:
(4) shiharai = kakaku + tsuri
(5) maisu = 〔ス〕 + 〔セ〕
(6) もし 〔ソ〕 < min_maisu ならば:
(7) 〔タ〕 = 〔ソ〕
(8) 表示する(min_maisu)
このプログラムを実行してみたところ3が表示された。46円を支払うときの最小交換硬貨枚数は、支払いで50円玉が1枚、1円玉が1枚、釣り銭で5円玉が1枚の計3枚なので、正しく計算できていることが分かる。同様に、kakaku の値をいろいろと変えて実行してみたところ、すべて正しく計算できていることを確認できた。
【サ・ソ・タの解答群】
⓪ maisu
① min_maisu
② shiharai
③ tsuri
【シの解答群】
⓪ 0
① 1
② 99
③ 100
【ス・セの解答群】
⓪ 枚数(shiharai)
① 枚数(kakaku)
② 枚数(tsuri)
③ shiharai
④ kakaku
⑤ tsuri
次の生徒(S)と先生(T)の会話文を読み、空欄〔ア〕に当てはまる数字をマークせよ。
また、空欄〔イ〕〜〔エ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ウ〕・〔エ〕は解答の順序は問わない
S:この前、お客さんが460円の商品を買うのに、510円を払って、釣り銭を50円受け取っていたのを見て、授業で勉強したプログラミングで、そんな「上手な払い方」を計算するプログラムを作ってみたいなと思いました。
T:いいですね。「上手な払い方」とは何を考える必要がありますね。
S:普通は手持ちの硬貨の枚数を少なくするような払い方でしょうか。
T:そうですね。ただ、ここでは、客が支払う枚数と釣り銭を受け取る枚数の合計を最小にする払い方を考えてみませんか?客も店も十分な枚数の効果を持っていると仮定しましょう。計算を簡単にするために、100円以下の買い物とし、使う硬貨は1円玉、5円玉、10円玉、50円玉、100円玉のみで500円玉は使わない場合を考えてみましょう。
例えば、46円をちょうど支払う場合、支払い枚数はどうなりますか?
S:46円を支払うには、10円玉4枚、5円玉1枚、1円玉1枚という6枚で払い方が最小の枚数になります。
T:そうですね。一方、同じ46円を支払うのに、51円を支払って釣り銭5円受け取る払い方では、支払いに2枚、釣り銭に1枚で、合計3枚の硬貨のやりとりになります。こうすると交換する硬貨の枚数の合計が最小になりますね。
S:これが上手な払い方ですね。
T:そうです。このように、客と店員が交換する硬貨の合計が最小となる枚数、すなわち「最小交換硬貨枚数」の計算を考えましょう。
S:どうやって考えればいいかなぁ。
T:ここでは、次の関数のプログラムを作り、それを使う方法を考えてみましょう。目標の金額を釣り銭無くちょうど支払うために必要な最小の硬貨枚数を求める関数です。
【関数の説明と例】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
例:8円は「5円玉が1枚と1円玉が3枚」の組合せで最小の硬貨枚数になるので、枚数(8)の値は4となる。
これは、例えば、枚数(46)=〔ア〕 と計算してくれるような関数です。これを使って最小交換硬貨枚数の計算を考えてみましょう。例えば、46円を支払うのに、51円払って5円の釣り銭を受け取る払い方をした場合、客と店員の間で交換される硬貨枚数の合計は、この関数を使うと、どのように計算できますか?
S:〔イ〕で求められますね。
T:一般に、商品の価格x円に対して釣り銭y円を0,1,2,・・・と変化させて、それぞれの場合に必要な硬貨の枚数の合計を
枚数(〔ウ〕)+枚数(〔エ〕)と計算し、一番小さな値を最小交換硬貨枚数とすればよいのです。
S:なるほど。それで、釣り銭yはいくらまで調べればよいでしょうか?
T:面白い数字パズルですね。まあ、詳しくは今度考えるとして、今回は100円以下の商品なのでyは99まで調べれば十分でしょう。
【イの解答群】
⓪ 枚数(51)+枚数(5)
① 枚数(46)+枚数(5)
② 枚数(51)−枚数(5)
③ 枚数(46)−枚数(5)
【ウ・エの解答群】
⓪ x
① y
② x+y
③ x−y
問2
次の文章の空欄〔オ〕〜〔コ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。
S:まずは、関数「枚数(金額)」のプログラムを作るために、与えられた金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみます。もう少しヒントが欲しいなぁ。
T:金額に対して、高額の硬貨から使うように考えて枚数と残金を計算していくとよいでしょう。また、金額に対して、ある額の硬貨が何枚まで使えて、残金がいくらになるかを計算するには、整数値の商を求める演算「÷」とその余りを求める演算「%」が使えるでしょう。例えば、46円に対して10円玉が何枚まで使えるかは〔オ〕で、その際にいくら残るかは〔カ〕で求めることができますね。
S:なるほど!あとは自分でできそうです。
Sさんは、先生(T)との会話からヒントを得て、変数 kingaku に与えられた目標の金額(100円以下)に対し、その金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみた(図1)。ここでは例として目標の金額を46円としている。
配列 kouka に硬貨の単位を小さい順に設定している。なお、配列の添え字は0から始まるものとする。最低額の硬貨が1円玉なのでkouka[0]の値は1となる。
先生(T)のヒントに従い、高額の硬貨から何枚まで使えるかを計算する方針で、(4)〜(6)行目のような繰り返し文にした。この繰り返しで、変数 maisu に支払う硬貨の枚数の合計が計算され、変数 nokori に残りいくら支払えればよいか、という残金が計算される。
実行してみると〔ア〕が表示されたので、正しく計算できていることが分かる。いろいろな例で試してみたが、すべて正しく計算できていることを確認できた。
(図1)目標の金額ちょうどになる最小の硬貨枚数を計算するプログラム
(1) kouka = [1,5,10,50,100]
(2) kingaku = 46
(3) maisu = 0, nokori = kingaku
(4) 〔i〕を 〔キ〕 ながら繰り返す:
(5) maisu = 〔ク〕 + 〔ケ〕
(6) nokori = 〔コ〕
(7) 表示する(maisu)
【オ・カの解答群】
⓪ 46 ÷ 10 + 1
① 46 % 10 − 1
② 46 ÷ 10
③ 46 % 10
【キの解答群】
⓪ 5から1まで1ずつ減らし
① 4から0まで1ずつ減らし
② 0から4まで1ずつ増やし
③ 1から5まで1ずつ増やし
【クの解答群】
⓪ 1
① maisu
② i
③ nokori
【ケ・コの解答群】
⓪ nokori ÷ Kouka[i]
① nokori % Kouka[i]
② maisu ÷ Kouka[i]
③ maisu % Kouka[i]
問3
次の文章を参考に、図2のプログラムの空欄〔サ〕〜〔タ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ス〕・〔セ〕は解答の順序は問わない。
T:プログラム(図1)ができたようですね。それを使えば、関数「枚数(金額)」のプログラムができます。関数の引数として与えられる金額の値をプログラム(図1)の変数 kingaku に設定し、(7)行目の代わりに変数 maisu の値を関数の戻り値とすれば、関数「枚数(金額)」のプログラムとなります。では、その関数を使って最小交換硬貨枚数を計算するプログラムを作ってみましょう。ここでも、100円以下の買い物として考えてみます。
【関数の説明(再掲)】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
Sさんは、図2のようなプログラムを作成した。変数 kakaku に与えられる商品の価格に対して、釣り銭を変数 tsuri を用意し、妥当な tsuri のすべての値に対して交換する硬貨の枚数を調べ、その最小値を求めるプログラムである。なお、ここでは例として商品の価格を46円としている。
このプログラムでは、先生(T)のアドバイスに従い、釣り銭無しの場合も含め、99円までのすべての釣り銭に対し、その釣り銭になるように支払う場合に交換される硬貨の枚数を求め、その最小値を最小交換硬貨枚数として計算している。
最小値の計算では、これまでの払い方での最小枚数を変数 min_maisu に記憶しておき、それより少ない枚数の払い方が出るたびに更新している。min_maisuの初期値には、十分大きな値として100を用いている。100円以下の買い物では、使う硬貨の枚数は100枚を超えないからである。
(図2)最小交換硬貨枚数を求めるプログラム
(1) kakaku = 46
(2) min_maisu = 100
(3) 〔サ〕を 〔ジ〕 から 99 まで1ずつ増やしながら繰り返す:
(4) shiharai = kakaku + tsuri
(5) maisu = 〔ス〕 + 〔セ〕
(6) もし 〔ソ〕 < min_maisu ならば:
(7) 〔タ〕 = 〔ソ〕
(8) 表示する(min_maisu)
このプログラムを実行してみたところ3が表示された。46円を支払うときの最小交換硬貨枚数は、支払いで50円玉が1枚、1円玉が1枚、釣り銭で5円玉が1枚の計3枚なので、正しく計算できていることが分かる。同様に、kakaku の値をいろいろと変えて実行してみたところ、すべて正しく計算できていることを確認できた。
【サ・ソ・タの解答群】
⓪ maisu
① min_maisu
② shiharai
③ tsuri
【シの解答群】
⓪ 0
① 1
② 99
③ 100
【ス・セの解答群】
⓪ 枚数(shiharai)
① 枚数(kakaku)
② 枚数(tsuri)
③ shiharai
④ kakaku
⑤ tsuri
チャプター:
00:00 導入
01:21 問1
03:15 問2
06:47 問3
単元:
#情報Ⅰ(高校生)#プログラミング#アルゴリズムの表し方とプログラムの設計
指導講師:
理数個別チャンネル
問題文全文(内容文):
次の生徒(S)と先生(T)の会話文を読み、空欄〔ア〕に当てはまる数字をマークせよ。
また、空欄〔イ〕〜〔エ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ウ〕・〔エ〕は解答の順序は問わない
S:この前、お客さんが460円の商品を買うのに、510円を払って、釣り銭を50円受け取っていたのを見て、授業で勉強したプログラミングで、そんな「上手な払い方」を計算するプログラムを作ってみたいなと思いました。
T:いいですね。「上手な払い方」とは何を考える必要がありますね。
S:普通は手持ちの硬貨の枚数を少なくするような払い方でしょうか。
T:そうですね。ただ、ここでは、客が支払う枚数と釣り銭を受け取る枚数の合計を最小にする払い方を考えてみませんか?客も店も十分な枚数の効果を持っていると仮定しましょう。計算を簡単にするために、100円以下の買い物とし、使う硬貨は1円玉、5円玉、10円玉、50円玉、100円玉のみで500円玉は使わない場合を考えてみましょう。
例えば、46円をちょうど支払う場合、支払い枚数はどうなりますか?
S:46円を支払うには、10円玉4枚、5円玉1枚、1円玉1枚という6枚で払い方が最小の枚数になります。
T:そうですね。一方、同じ46円を支払うのに、51円を支払って釣り銭5円受け取る払い方では、支払いに2枚、釣り銭に1枚で、合計3枚の硬貨のやりとりになります。こうすると交換する硬貨の枚数の合計が最小になりますね。
S:これが上手な払い方ですね。
T:そうです。このように、客と店員が交換する硬貨の合計が最小となる枚数、すなわち「最小交換硬貨枚数」の計算を考えましょう。
S:どうやって考えればいいかなぁ。
T:ここでは、次の関数のプログラムを作り、それを使う方法を考えてみましょう。目標の金額を釣り銭無くちょうど支払うために必要な最小の硬貨枚数を求める関数です。
【関数の説明と例】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
例:8円は「5円玉が1枚と1円玉が3枚」の組合せで最小の硬貨枚数になるので、枚数(8)の値は4となる。
これは、例えば、枚数(46)=〔ア〕 と計算してくれるような関数です。これを使って最小交換硬貨枚数の計算を考えてみましょう。例えば、46円を支払うのに、51円払って5円の釣り銭を受け取る払い方をした場合、客と店員の間で交換される硬貨枚数の合計は、この関数を使うと、どのように計算できますか?
S:〔イ〕で求められますね。
T:一般に、商品の価格x円に対して釣り銭y円を0,1,2,・・・と変化させて、それぞれの場合に必要な硬貨の枚数の合計を
枚数(〔ウ〕)+枚数(〔エ〕)と計算し、一番小さな値を最小交換硬貨枚数とすればよいのです。
S:なるほど。それで、釣り銭yはいくらまで調べればよいでしょうか?
T:面白い数字パズルですね。まあ、詳しくは今度考えるとして、今回は100円以下の商品なのでyは99まで調べれば十分でしょう。
【イの解答群】
⓪ 枚数(51)+枚数(5)
① 枚数(46)+枚数(5)
② 枚数(51)−枚数(5)
③ 枚数(46)−枚数(5)
【ウ・エの解答群】
⓪ x
① y
② x+y
③ x−y
問2
次の文章の空欄〔オ〕〜〔コ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。
S:まずは、関数「枚数(金額)」のプログラムを作るために、与えられた金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみます。もう少しヒントが欲しいなぁ。
T:金額に対して、高額の硬貨から使うように考えて枚数と残金を計算していくとよいでしょう。また、金額に対して、ある額の硬貨が何枚まで使えて、残金がいくらになるかを計算するには、整数値の商を求める演算「÷」とその余りを求める演算「%」が使えるでしょう。例えば、46円に対して10円玉が何枚まで使えるかは〔オ〕で、その際にいくら残るかは〔カ〕で求めることができますね。
S:なるほど!あとは自分でできそうです。
Sさんは、先生(T)との会話からヒントを得て、変数 kingaku に与えられた目標の金額(100円以下)に対し、その金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみた(図1)。ここでは例として目標の金額を46円としている。
配列 kouka に硬貨の単位を小さい順に設定している。なお、配列の添え字は0から始まるものとする。最低額の硬貨が1円玉なのでkouka[0]の値は1となる。
先生(T)のヒントに従い、高額の硬貨から何枚まで使えるかを計算する方針で、(4)〜(6)行目のような繰り返し文にした。この繰り返しで、変数 maisu に支払う硬貨の枚数の合計が計算され、変数 nokori に残りいくら支払えればよいか、という残金が計算される。
実行してみると〔ア〕が表示されたので、正しく計算できていることが分かる。いろいろな例で試してみたが、すべて正しく計算できていることを確認できた。
(図1)目標の金額ちょうどになる最小の硬貨枚数を計算するプログラム
(1) kouka = [1,5,10,50,100]
(2) kingaku = 46
(3) maisu = 0, nokori = kingaku
(4) 〔i〕を 〔キ〕 ながら繰り返す:
(5) maisu = 〔ク〕 + 〔ケ〕
(6) nokori = 〔コ〕
(7) 表示する(maisu)
【オ・カの解答群】
⓪ 46 ÷ 10 + 1
① 46 % 10 − 1
② 46 ÷ 10
③ 46 % 10
【キの解答群】
⓪ 5から1まで1ずつ減らし
① 4から0まで1ずつ減らし
② 0から4まで1ずつ増やし
③ 1から5まで1ずつ増やし
【クの解答群】
⓪ 1
① maisu
② i
③ nokori
【ケ・コの解答群】
⓪ nokori ÷ Kouka[i]
① nokori % Kouka[i]
② maisu ÷ Kouka[i]
③ maisu % Kouka[i]
問3
次の文章を参考に、図2のプログラムの空欄〔サ〕〜〔タ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ス〕・〔セ〕は解答の順序は問わない。
T:プログラム(図1)ができたようですね。それを使えば、関数「枚数(金額)」のプログラムができます。関数の引数として与えられる金額の値をプログラム(図1)の変数 kingaku に設定し、(7)行目の代わりに変数 maisu の値を関数の戻り値とすれば、関数「枚数(金額)」のプログラムとなります。では、その関数を使って最小交換硬貨枚数を計算するプログラムを作ってみましょう。ここでも、100円以下の買い物として考えてみます。
【関数の説明(再掲)】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
Sさんは、図2のようなプログラムを作成した。変数 kakaku に与えられる商品の価格に対して、釣り銭を変数 tsuri を用意し、妥当な tsuri のすべての値に対して交換する硬貨の枚数を調べ、その最小値を求めるプログラムである。なお、ここでは例として商品の価格を46円としている。
このプログラムでは、先生(T)のアドバイスに従い、釣り銭無しの場合も含め、99円までのすべての釣り銭に対し、その釣り銭になるように支払う場合に交換される硬貨の枚数を求め、その最小値を最小交換硬貨枚数として計算している。
最小値の計算では、これまでの払い方での最小枚数を変数 min_maisu に記憶しておき、それより少ない枚数の払い方が出るたびに更新している。min_maisuの初期値には、十分大きな値として100を用いている。100円以下の買い物では、使う硬貨の枚数は100枚を超えないからである。
(図2)最小交換硬貨枚数を求めるプログラム
(1) kakaku = 46
(2) min_maisu = 100
(3) 〔サ〕を 〔ジ〕 から 99 まで1ずつ増やしながら繰り返す:
(4) shiharai = kakaku + tsuri
(5) maisu = 〔ス〕 + 〔セ〕
(6) もし 〔ソ〕 < min_maisu ならば:
(7) 〔タ〕 = 〔ソ〕
(8) 表示する(min_maisu)
このプログラムを実行してみたところ3が表示された。46円を支払うときの最小交換硬貨枚数は、支払いで50円玉が1枚、1円玉が1枚、釣り銭で5円玉が1枚の計3枚なので、正しく計算できていることが分かる。同様に、kakaku の値をいろいろと変えて実行してみたところ、すべて正しく計算できていることを確認できた。
【サ・ソ・タの解答群】
⓪ maisu
① min_maisu
② shiharai
③ tsuri
【シの解答群】
⓪ 0
① 1
② 99
③ 100
【ス・セの解答群】
⓪ 枚数(shiharai)
① 枚数(kakaku)
② 枚数(tsuri)
③ shiharai
④ kakaku
⑤ tsuri
次の生徒(S)と先生(T)の会話文を読み、空欄〔ア〕に当てはまる数字をマークせよ。
また、空欄〔イ〕〜〔エ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ウ〕・〔エ〕は解答の順序は問わない
S:この前、お客さんが460円の商品を買うのに、510円を払って、釣り銭を50円受け取っていたのを見て、授業で勉強したプログラミングで、そんな「上手な払い方」を計算するプログラムを作ってみたいなと思いました。
T:いいですね。「上手な払い方」とは何を考える必要がありますね。
S:普通は手持ちの硬貨の枚数を少なくするような払い方でしょうか。
T:そうですね。ただ、ここでは、客が支払う枚数と釣り銭を受け取る枚数の合計を最小にする払い方を考えてみませんか?客も店も十分な枚数の効果を持っていると仮定しましょう。計算を簡単にするために、100円以下の買い物とし、使う硬貨は1円玉、5円玉、10円玉、50円玉、100円玉のみで500円玉は使わない場合を考えてみましょう。
例えば、46円をちょうど支払う場合、支払い枚数はどうなりますか?
S:46円を支払うには、10円玉4枚、5円玉1枚、1円玉1枚という6枚で払い方が最小の枚数になります。
T:そうですね。一方、同じ46円を支払うのに、51円を支払って釣り銭5円受け取る払い方では、支払いに2枚、釣り銭に1枚で、合計3枚の硬貨のやりとりになります。こうすると交換する硬貨の枚数の合計が最小になりますね。
S:これが上手な払い方ですね。
T:そうです。このように、客と店員が交換する硬貨の合計が最小となる枚数、すなわち「最小交換硬貨枚数」の計算を考えましょう。
S:どうやって考えればいいかなぁ。
T:ここでは、次の関数のプログラムを作り、それを使う方法を考えてみましょう。目標の金額を釣り銭無くちょうど支払うために必要な最小の硬貨枚数を求める関数です。
【関数の説明と例】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
例:8円は「5円玉が1枚と1円玉が3枚」の組合せで最小の硬貨枚数になるので、枚数(8)の値は4となる。
これは、例えば、枚数(46)=〔ア〕 と計算してくれるような関数です。これを使って最小交換硬貨枚数の計算を考えてみましょう。例えば、46円を支払うのに、51円払って5円の釣り銭を受け取る払い方をした場合、客と店員の間で交換される硬貨枚数の合計は、この関数を使うと、どのように計算できますか?
S:〔イ〕で求められますね。
T:一般に、商品の価格x円に対して釣り銭y円を0,1,2,・・・と変化させて、それぞれの場合に必要な硬貨の枚数の合計を
枚数(〔ウ〕)+枚数(〔エ〕)と計算し、一番小さな値を最小交換硬貨枚数とすればよいのです。
S:なるほど。それで、釣り銭yはいくらまで調べればよいでしょうか?
T:面白い数字パズルですね。まあ、詳しくは今度考えるとして、今回は100円以下の商品なのでyは99まで調べれば十分でしょう。
【イの解答群】
⓪ 枚数(51)+枚数(5)
① 枚数(46)+枚数(5)
② 枚数(51)−枚数(5)
③ 枚数(46)−枚数(5)
【ウ・エの解答群】
⓪ x
① y
② x+y
③ x−y
問2
次の文章の空欄〔オ〕〜〔コ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。
S:まずは、関数「枚数(金額)」のプログラムを作るために、与えられた金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみます。もう少しヒントが欲しいなぁ。
T:金額に対して、高額の硬貨から使うように考えて枚数と残金を計算していくとよいでしょう。また、金額に対して、ある額の硬貨が何枚まで使えて、残金がいくらになるかを計算するには、整数値の商を求める演算「÷」とその余りを求める演算「%」が使えるでしょう。例えば、46円に対して10円玉が何枚まで使えるかは〔オ〕で、その際にいくら残るかは〔カ〕で求めることができますね。
S:なるほど!あとは自分でできそうです。
Sさんは、先生(T)との会話からヒントを得て、変数 kingaku に与えられた目標の金額(100円以下)に対し、その金額ちょうどになる最小の硬貨枚数を計算するプログラムを考えてみた(図1)。ここでは例として目標の金額を46円としている。
配列 kouka に硬貨の単位を小さい順に設定している。なお、配列の添え字は0から始まるものとする。最低額の硬貨が1円玉なのでkouka[0]の値は1となる。
先生(T)のヒントに従い、高額の硬貨から何枚まで使えるかを計算する方針で、(4)〜(6)行目のような繰り返し文にした。この繰り返しで、変数 maisu に支払う硬貨の枚数の合計が計算され、変数 nokori に残りいくら支払えればよいか、という残金が計算される。
実行してみると〔ア〕が表示されたので、正しく計算できていることが分かる。いろいろな例で試してみたが、すべて正しく計算できていることを確認できた。
(図1)目標の金額ちょうどになる最小の硬貨枚数を計算するプログラム
(1) kouka = [1,5,10,50,100]
(2) kingaku = 46
(3) maisu = 0, nokori = kingaku
(4) 〔i〕を 〔キ〕 ながら繰り返す:
(5) maisu = 〔ク〕 + 〔ケ〕
(6) nokori = 〔コ〕
(7) 表示する(maisu)
【オ・カの解答群】
⓪ 46 ÷ 10 + 1
① 46 % 10 − 1
② 46 ÷ 10
③ 46 % 10
【キの解答群】
⓪ 5から1まで1ずつ減らし
① 4から0まで1ずつ減らし
② 0から4まで1ずつ増やし
③ 1から5まで1ずつ増やし
【クの解答群】
⓪ 1
① maisu
② i
③ nokori
【ケ・コの解答群】
⓪ nokori ÷ Kouka[i]
① nokori % Kouka[i]
② maisu ÷ Kouka[i]
③ maisu % Kouka[i]
問3
次の文章を参考に、図2のプログラムの空欄〔サ〕〜〔タ〕に入れるのに最も適当なものを、後の解答群のうちから一つずつ選べ。ただし、空欄〔ス〕・〔セ〕は解答の順序は問わない。
T:プログラム(図1)ができたようですね。それを使えば、関数「枚数(金額)」のプログラムができます。関数の引数として与えられる金額の値をプログラム(図1)の変数 kingaku に設定し、(7)行目の代わりに変数 maisu の値を関数の戻り値とすれば、関数「枚数(金額)」のプログラムとなります。では、その関数を使って最小交換硬貨枚数を計算するプログラムを作ってみましょう。ここでも、100円以下の買い物として考えてみます。
【関数の説明(再掲)】
枚数(金額)…引数として「金額」が与えられ、ちょうどその金額となる硬貨の組合せの中で、枚数が最小となる硬貨枚数が戻り値となる関数。
Sさんは、図2のようなプログラムを作成した。変数 kakaku に与えられる商品の価格に対して、釣り銭を変数 tsuri を用意し、妥当な tsuri のすべての値に対して交換する硬貨の枚数を調べ、その最小値を求めるプログラムである。なお、ここでは例として商品の価格を46円としている。
このプログラムでは、先生(T)のアドバイスに従い、釣り銭無しの場合も含め、99円までのすべての釣り銭に対し、その釣り銭になるように支払う場合に交換される硬貨の枚数を求め、その最小値を最小交換硬貨枚数として計算している。
最小値の計算では、これまでの払い方での最小枚数を変数 min_maisu に記憶しておき、それより少ない枚数の払い方が出るたびに更新している。min_maisuの初期値には、十分大きな値として100を用いている。100円以下の買い物では、使う硬貨の枚数は100枚を超えないからである。
(図2)最小交換硬貨枚数を求めるプログラム
(1) kakaku = 46
(2) min_maisu = 100
(3) 〔サ〕を 〔ジ〕 から 99 まで1ずつ増やしながら繰り返す:
(4) shiharai = kakaku + tsuri
(5) maisu = 〔ス〕 + 〔セ〕
(6) もし 〔ソ〕 < min_maisu ならば:
(7) 〔タ〕 = 〔ソ〕
(8) 表示する(min_maisu)
このプログラムを実行してみたところ3が表示された。46円を支払うときの最小交換硬貨枚数は、支払いで50円玉が1枚、1円玉が1枚、釣り銭で5円玉が1枚の計3枚なので、正しく計算できていることが分かる。同様に、kakaku の値をいろいろと変えて実行してみたところ、すべて正しく計算できていることを確認できた。
【サ・ソ・タの解答群】
⓪ maisu
① min_maisu
② shiharai
③ tsuri
【シの解答群】
⓪ 0
① 1
② 99
③ 100
【ス・セの解答群】
⓪ 枚数(shiharai)
① 枚数(kakaku)
② 枚数(tsuri)
③ shiharai
④ kakaku
⑤ tsuri
投稿日:2026.02.08





