各桁の和(後判定の繰返し)|擬似言語のトレース解説と練習問題

レベル:入門 / タグ:do-while・の商・の余り

関数 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) で呼び出したときの、全ステップのトレース表です。太字は、その文で値が変わった変数です。

#行したことnsum
12宣言264350
24代入264355
35代入26435
46条件判定(真)26435
54代入26438
65代入2648
76条件判定(真)2648
84代入26412
95代入2612
106条件判定(真)2612
114代入2618
125代入218
136条件判定(真)218
144代入220
155代入020
166条件判定(偽)020
177戻る(20)020

この例題で問われること

問 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問)

本試験と同じくらいの量。レベル:入門

  1. 問題01 digitSum(14138)
  2. 問題02 digitSum(5311)
  3. 問題03 digitSum(286)
  4. 問題04 digitSum(92450)
  5. 問題05 digitSum(96853)
  6. 問題06 digitSum(95159)
  7. 問題07 digitSum(58507)
  8. 問題08 digitSum(73)
  9. 問題09 digitSum(42088)
  10. 問題10 digitSum(7345)
もっと解く(追加の20問)
  1. 問題11 digitSum(39744)
  2. 問題12 digitSum(54531)
  3. 問題13 digitSum(13737)
  4. 問題14 digitSum(11363)
  5. 問題15 digitSum(68691)
  6. 問題16 digitSum(52694)
  7. 問題17 digitSum(26041)
  8. 問題18 digitSum(95976)
  9. 問題19 digitSum(99159)
  10. 問題20 digitSum(75182)
  11. 問題21 digitSum(46149)
  12. 問題22 digitSum(79552)
  13. 問題23 digitSum(20024)
  14. 問題24 digitSum(11243)
  15. 問題25 digitSum(36204)
  16. 問題26 digitSum(18323)
  17. 問題27 digitSum(3496)
  18. 問題28 digitSum(53747)
  19. 問題29 digitSum(94012)
  20. 問題30 digitSum(99858)

ほかのアルゴリズム