カプレカ定数というものを探すプログラムを作りましょう.例えば3桁の整数 495 は,その数字を大きい順に並べ替えた 954 から小さい順に並べ替えた 459 を引くと,495 となり,最初の数に戻ります.このような数をカプレカ定数と言います.3桁の正の整数であればどんな数でも,その数を大きい数字順に並べ替えたものから小さい順に並べ替えたものを引き,その差をまた並べ替えていくという操作を行うと必ずカプレカ定数に行きつきます.
Start from 790 970 - 79 = 891 981 - 189 = 792 972 - 279 = 693 963 - 369 = 594 954 - 459 = 495 954 - 459 = 495 |
課題としては,4桁のカプレカ定数を探すプログラムを作りましょう.最初に4桁の正の整数を乱数により1つ発生させ,それを上のように並べ替えて計算して求めます.
今回文字列の並べ替えを行いましたが,int 型の整数を str 関数で文字列に変換すると sorted 関数で並べ替えができます.今回の演習問題の iv. のように,文字列であればソートできるので,文字列から数値への変換を用いると,割と簡単にできます.
Student number: s246099 Start from 1330 3310 - 133 = 3177 7731 - 1377 = 6354 6543 - 3456 = 3087 ··· 以下略 ··· ------------------------ |
引き算の結果が2回続けて同じ数になると処理を終わるプログラムにしてください.そのためには一つ前の答と比較する必要があります.
なお,非常に低い確率で1桁のカプレカ定数である 0 になってしまうことがありますが,それは間違いではありません.最初に乱数で 1211 とかが出てしまうと,2111 - 1112 = 999 となり,並べ替えても 999 - 999 = 0 となり,0 - 0 = 0 でそれも答えではあります.(4桁ではありませんが)
ヒント int 型整数 num を文字列にする str(num) 文字列 st をソートする sorted(st) ソートした文字列リストを1つの文字列につなげる ''.join(sorted(st)) 文字列 st を int 型にする int(st) |
解答用紙を使用する際には,学生番号と名前の記入も忘れないでください.さらに,解答用紙自体がPythonのプログラムとなっていますので,実行してエラーの無いことを確認してから提出してください. 指定の解答用紙を使用していない,実行時にエラーが出る,学生番号と名前が無い,というような答案は提出されても採点しません.注意してください. |
# ############################# # # プログラミング入門I 宿題 2025.1.20 # 学生番号: s246099 # <-- 書き換える # 氏名: 松江 花子 # <-- 書き換える # # ############################# import random print('Student number: s246099') # <-- 書き換える print() # <-- 消さない num = random.randint(1000, 9999) print(f'Start from {num}') prev = 0 while num != prev: num_up = int(''.join(sorted(str(num)))) num_dn = int(''.join(sorted(str(num), reverse = True))) prev = num num = num_dn - num_up print(f'{num_dn:4} - {num_up:4} = {num:4}') print('\n------------------------\n') |