各桁の和(後判定の繰返し)|擬似言語のトレース解説と練習問題
関数 digitSum は、正の整数 n の各桁の数字の和を返す。
プログラム
| 1 | ○整数型: digitSum(整数型: n) |
| 2 | 整数型: sum ← 0 |
| 3 | do |
| 4 | sum ← sum + n ÷ 10 の余り |
| 5 | n ← n ÷ 10 の商 |
| 6 | while (n > 0) |
| 7 | return sum |
何をしているか
10 で割った余りは一の位です。それを足したあと、n を 10 で割った商に置き換えると、一の位が消えて次の桁が一の位に来ます。これを n が 0 になるまで繰り返すと、各桁の和が求まります。
トレースのコツ
- 1回の繰返しで、
sumとnの両方が変わります。先にsum、次にnの順です。 do〜whileは、本体を実行したあとで条件を調べます。本体は必ず1回は実行されます。- 繰返しの回数は、n の桁数と同じです。
よくある間違い
- 「の商」と「の余り」を逆にする。余りが一の位、商が残りの桁です。
- 条件を先に調べてしまう。while と違い、最初の1回は条件に関係なく実行されます。
- n を置き換えたあとの値で余りを取る。行の順番どおりに追います。
例題:digitSum(26435) を最後まで追う
上のプログラムを digitSum(26435) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。
| # | 行 | したこと | n | sum |
|---|---|---|---|---|
| 1 | 2 | 宣言 | 26435 | 0 |
| 2 | 4 | 代入 | 26435 | 5 |
| 3 | 5 | 代入 | 2643 | 5 |
| 4 | 6 | 条件判定(真) | 2643 | 5 |
| 5 | 4 | 代入 | 2643 | 8 |
| 6 | 5 | 代入 | 264 | 8 |
| 7 | 6 | 条件判定(真) | 264 | 8 |
| 8 | 4 | 代入 | 264 | 12 |
| 9 | 5 | 代入 | 26 | 12 |
| 10 | 6 | 条件判定(真) | 26 | 12 |
| 11 | 4 | 代入 | 26 | 18 |
| 12 | 5 | 代入 | 2 | 18 |
| 13 | 6 | 条件判定(真) | 2 | 18 |
| 14 | 4 | 代入 | 2 | 20 |
| 15 | 5 | 代入 | 0 | 20 |
| 16 | 6 | 条件判定(偽) | 0 | 20 |
| 17 | 7 | 戻る(20) | 0 | 20 |
この例題で問われること
問 digitSum(26435) を呼び出したときの戻り値はどれか。
答え 20
- 戻り値になる sum は、0 → 5 → 8 → 12 → 18 → 20 と変わります。
- 7行目で返す時点の値 20 が答えです。
問 4行目を4回目に実行した直後の、変数 sum の値はどれか。
答え 18
- 4行目は全部で5回実行されます。
- 実行した直後の sum は、順に 5 → 8 → 12 → 18 → 20 です。
- 4回目の直後なので、答えは 18 です。
問 4行目が実行される回数はどれか。
答え 5
- 4行目は5回実行されます。トレース表で 4行目の行を数えると確かめられます。
練習問題 標準(10問)
本試験と同じくらいの量。レベル:入門
- 問題01 digitSum(14138)
- 問題02 digitSum(5311)
- 問題03 digitSum(286)
- 問題04 digitSum(92450)
- 問題05 digitSum(96853)
- 問題06 digitSum(95159)
- 問題07 digitSum(58507)
- 問題08 digitSum(73)
- 問題09 digitSum(42088)
- 問題10 digitSum(7345)
もっと解く(追加の20問)
- 問題11 digitSum(39744)
- 問題12 digitSum(54531)
- 問題13 digitSum(13737)
- 問題14 digitSum(11363)
- 問題15 digitSum(68691)
- 問題16 digitSum(52694)
- 問題17 digitSum(26041)
- 問題18 digitSum(95976)
- 問題19 digitSum(99159)
- 問題20 digitSum(75182)
- 問題21 digitSum(46149)
- 問題22 digitSum(79552)
- 問題23 digitSum(20024)
- 問題24 digitSum(11243)
- 問題25 digitSum(36204)
- 問題26 digitSum(18323)
- 問題27 digitSum(3496)
- 問題28 digitSum(53747)
- 問題29 digitSum(94012)
- 問題30 digitSum(99858)