レッスン98
Python(パイソン)で算数のパズルを解こう!⌗
今回は、プログラミングを使ってある数を見つけましょう。
探したい数はこちら
- 5桁の数字であること(10000 から 99999 まで)
- 11の倍数であること(11で割り切れる数)
- すべての桁の数字がバラバラであること(例:12345はOK、12234は「2」がダブっているからダメ)
- これらの数のうち一番大きい数
6つのステップを順番にクリアしながら、数を探しましょう。
準備:パソコンに「くり返し」をやらせてみよう!⌗
[ステップ1] 1から10までの数を表示しよう⌗
まずは、パソコンに「1から10まで数えて!」とお願いしてみます。
Pythonでは、数を順番に作るために range(レンジ) という便利な命令を使います。
使うコード⌗
for i in range(1, 11):
print(i)
解説(かいせつ)⌗
for i in ... :は、「数字を1つずつiという名前の箱に入れて、中の命令をくり返してね」という意味です。range(1, 11)は、「1から始めて、11の前の数(つまり10)まで」という意味になります。プログラミングの世界では「終わりの数の1つ手前まで」というルールが多いので、ここはちょっとした引っかけポイントです!print(i)は、「箱の中身を画面に表示して」という意味です。
やってみよう! 画面に「1, 2, 3 … 10」と縦(たて)に並んで表示されたら大成功です!
[ステップ2] 10から1までの数を逆に表示しよう⌗
次はカウントダウンです!10からスタートして、1まで逆に数えてもらいましょう。
range の中に、ちょっとした「おまじない」を追加します。
使うコード⌗
for i in range(10, 0, -1):
print(i)
解説⌗
range(10, 0, -1)の中身を見てみましょう。- 最初の
10は、スタートする数。 - 次の
0は、ゴールの手前の数(0の手前なので「1」まで)。 - 最後の
-1は、「1ずつ減(へ)らしていくよ」という意味です。
やってみよう! 「10, 9, 8 … 1」とカウントダウンが始まったかな?
本番:5桁の数字を調べていこう!⌗
[ステップ3] 99,999から10,000までの数を表示しよう⌗
さあ、ここから本番の「5桁の数字」に突入(とつにゅう)です! 今回の問題は「一番大きいもの」を探したいので、ステップ2と同じように大きい数から順番にカウントダウンしていきます。
5桁で一番大きい数は 99999、一番小さい数は 10000 ですね。
使うコード⌗
for i in range(99999, 9999, -1):
print(i)
解説⌗
99999からスタートします。10000まで表示したいので、ゴールの数字はその1つ手前の9999に設定します。-1で1つずつ減らしていきます。
きをつけて! これを実行(じっこう)すると、画面にものすごいスピードで大量(たいりょう)の数字が流れます!パソコンが一生懸命(いっしょうけんめい)数えている証拠(しょうこ)です。びっくりしないでね。
[ステップ4] その中で「11の倍数」だけを表示しよう⌗
ステップ3で流れた大量の数字の中から、11の倍数だけを選(えら)び出してみましょう。
「11の倍数」ということは、「11で割(わ)ったときにあまりが0になる数」ということです。Pythonでは、あまりを計算するときに % という記号を使います。
使うコード⌗
for i in range(99999, 9999, -1):
if i % 11 == 0:
print(i)
解説⌗
if(イフ)は、「もし〜なら」という条件(じょうけん)をつける命令です。i % 11 == 0は、「数字(i)を11で割ったあまりが、0と等しい(==)なら」という意味になります。- この条件にピッタリ合う数だけが、
print(i)で画面に表示されます。
これで、画面には 99990、99979、99968…… と、11ずつ減っていく数字のリスト(5桁の11の倍数)が表示されるようになりました!
発展:パズルを解くための「最後の道具」⌗
最後に残った条件は、「すべての桁の数字がバラバラ(同じ数字がない)」ということです。
これを調べるために、set(セット) というとても便利な道具の使い方を学びましょう。
[ステップ5] 同じ数を消し去る「set」の魔法⌗
set とは、日本語で「集合(しゅうごう)」と言います。
これを使うと、「同じものを1つにまとめちゃう(ダブりを消す)」という魔法が使えます。
setのイメージ⌗
例えば、おもちゃ箱の中に [ "ミニカー", "ブロック", "ミニカー", "積み木" ] と入っていたとします。「ミニカー」がダブっていますね。
これを set の魔法にかけると、ダブりが消えて {"ミニカー", "ブロック", "積み木"} になります!
数字でも同じです。"99990" という文字を set に入れると、たくさんある「9」が1つにまとまって、{"9", "0"} になっちゃいます。
使うコード⌗
まずは、次のコードを動かして set のすごさを実験してみましょう。
# 1. 実験する文字を準備する
text = "99990"
# 2. set に変身させる!
my_set = set(text)
print("setに変身したあと:", my_set)
# 3. 要素数(中身の個数)を数える!
print("中身の個数:", len(my_set))
解説⌗
set(text)で、文字をsetに変身させています。画面を見ると、ダブっていた「9」が1つだけになっていますね!len(レン)は、「中身の個数(長さ)」を数えてくれる命令です。99990は本来5文字ですが、ダブりが消えて9と0だけになったので、個数は2と表示されます。
考えてみよう! もし、すべての桁がバラバラの “12345” を set に入れたら、中身の個数(len)はいくつになるでしょうか? そう、ダブりがないので 5 のままになります! つまり、「len が 5 だったら、全部バラバラの数字!」と判定できるのです。
[ステップ6] ついに完成!すべての条件に合う「最大の数」を見つけよう!⌗
さあ、いよいよ最後の仕上げです!
ステップ4で作ったコードに、今学んだ set の魔法を組み合わせます。
数字(i)をそのままでは set に入れられないので、一度 str(i) という命令を使って「文字」に変えてから set に入れます。
使うコード⌗
for i in range(99999, 9999, -1):
if i % 11 == 0:
# 数字を文字に変えてから、setにする
text = str(i)
my_set = set(text)
# もし、ダブりがなくて個数が5個のままなら表示する!
if len(my_set) == 5:
print("見つけた!条件に合う最大の数は :", i)
break # 1つ見つかったら、そこで終わりにするおまじない
解説⌗
str(i)は、数字の99990を、文字の"99990"に変換する命令です。if len(my_set) == 5:で、「文字が1つもダブっていない(5種類の数字が全部ある)」という条件をチェックしています。break(ブレイク)は、「くり返しを途中で終わりにする」という命令です。今回は大きい数から順番(99999からカウントダウン)に調べているので、一番最初に見つかった数が、自動的に「一番大きい数」になります!だから、1つ見つかったらそこでプログラムを終了します。