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) で画面に表示されます。

これで、画面には 999909997999968…… と、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文字ですが、ダブりが消えて 90 だけになったので、個数は 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つ見つかったらそこでプログラムを終了します。

[ステップ7] 5桁より大きい桁の数の中で探してみましょう。