プログラミング入門I 宿題 2025.01.20

Back


カプレカ定数というものを探すプログラムを作りましょう.例えば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
3桁の整数の実行例

課題としては,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')


Back