第57問 選挙の議席はどう配る?(ドント式)
比例代表では、得票をそのまま比べるのではなく「ドント式」で議席を配ります。やり方は、各党の得票を 1, 2, 3 …と順番にわり、その商が大きい順に議席を渡していく、というものです。配列 tou に党名、hyou に得票(=[900,1500,600])、giseki にいま持っている議席(最初は全部0)が入っています。5議席を配るプログラムを完成させよう。商は「その党の得票 ÷(いま持っている議席 + 1)」で求めます。議席を取った党は、次からわる数が大きくなるので商が下がります(2か所の穴をうめよう)
難易度:★★★★☆(4/やや難しい)。単元:条件分岐・繰り返し・配列。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
tou = ["A党","B党","C党"]
hyou = [900,1500,600]
giseki = [0,0,0]
k を 1 から 5 まで 1 ずつ増やしながら繰り返す:
saidai = 0
touban = 0
i を 0 から 2 まで 1 ずつ増やしながら繰り返す:
shou = hyou[i] / [A]
もし shou > saidai ならば:
saidai = shou
touban = i
giseki[touban] = [B]
i を 0 から 2 まで 1 ずつ増やしながら繰り返す:
表示する(tou[i] + " " + giseki[i] + "議席")
空欄 [A]・[B] に当てはまるものを、次の選択肢から選びます。
選択肢
(giseki[i] + 1)
k
(i + 1)
giseki[touban] + 1
1
giseki[touban]
ヒント
ドント式は「得票 ÷(いま持っている議席 + 1)」を全部の党で計算し、その商がいちばん大きい党に1議席を渡す、をくり返します。議席を取った党は、次からわる数が1つ大きくなるので商が下がり、ほかの党に順番が回ります。議席を渡すところは giseki[touban] = giseki[touban] + 1 と、いまの数に1を足します。答えは A党1議席・B党3議席・C党1議席です
解答
- 空欄 [A] …
(giseki[i] + 1)
- 空欄 [B] …
giseki[touban] + 1
よくある間違い
- [A]
(giseki[i] + 1) [B]1 … わる数は正解です。でも giseki[touban] = 1 だと、何議席取っても「1」で上書きされてしまいます。同じ党が2議席目を取っても1のままなので、配り終えたときの合計が5議席になりません(A党1・B党1・C党0)。いま持っている数に1を足しましょう
- [A]
(giseki[i] + 1) [B]giseki[touban] … わる数は正解です。でも giseki[touban] = giseki[touban] は「何も変えない」ので、議席が1つも増えません。商もずっと同じままで、結果は全部0議席になります
- [A]
k [B]giseki[touban] + 1 … 議席を増やすところは正解です。でも k でわると、全部の党を同じ数でわることになります。それでは順位がずっと変わらず、いちばん票の多いB党が5議席を独り占めします(B党5議席)。わる数は党ごとに変わる「その党の議席 + 1」です
- [A]
k [B]1 … 2か所とも違います。k でわると順位が変わらずB党ばかりが選ばれ、さらに giseki[touban] = 1 で上書きされるので、B党1議席だけという結果になります
- [A]
k [B]giseki[touban] … 2か所とも違います。k でわると順位が変わらないうえ、議席も増えないので、結果は全部0議席です
- [A]
(i + 1) [B]giseki[touban] + 1 … 議席を増やすところは正解です。でも i + 1 は「何番目の党か」であって、その党が持っている議席の数ではありません。A党は必ず1でわられるので商が下がらず、A党が5議席を独り占めします
- [A]
(i + 1) [B]1 … 2か所とも違います。i + 1 だとA党がずっと有利なうえ、giseki[touban] = 1 で上書きされるので、A党1議席だけになります
- [A]
(i + 1) [B]giseki[touban] … 2か所とも違います。i + 1 は党の番号で、議席の数ではありません。さらに議席も増えないので、結果は全部0議席です
この単元の解説動画
ほかの問題