pypy.com/

Python、Unity、FX自動化などを勉強しています。あと、コーラと車も好きです。そこらへんについて、たまに記事を書きます。

pythonでカプレカ数を求める

こんにちは。
今回は知人の課題で出されたカプレカ数を求めるプログラムについて書きたいと思います。

カプレカ数?ってなるのが普通だと思うので、まずカプレカ数について説明します。

カプレカ数とは、整数の桁を並び替えて、最大のものから最小のものを引いたときに元の値となる数のことを言います。

例えば、6174とかがカプレカ数で、
7641-1467 = 6174
となることから、確認ができます。

求め方としては、適当な4桁の数(1111の倍数以外)を選び、
その数に対して、桁を並び替えて最大のものから最小のものを引くということを繰り返してやれば求まります。

それでは、書いていきます。

# -*- coding: utf-8 -*-
"""
Created on Thu Oct 24 09:26:54 2019

@author: taibo

カプレカ数を求める
"""

import random
from functools import reduce

print("桁数を入力してください")
digit = int(input())
invalid_number = int("1" * digit)
for i in range(10):
    number = random.randint(10 ** (digit-1), 10 ** (digit-1) * 10)
    if(number%invalid_number != 0):
        break

number2 = 0
func = lambda x,y:x+y
while True:
    if(number==number2):
        break
    number2 = number
    number_list = list(str(number))
    number_list.sort()
    min_number = int(reduce(func,number_list))
    max_number = int(reduce(func,number_list[::-1]))
    number = max_number - min_number
    
print(number)

少し、説明します。

桁数を入力してもらって、カプレカ数を出力するプログラムになります。

動きとしては、
入力された桁の乱数を発生させ、
その数に対して、桁をソートし、最大な数と最小な数を求め、
その差を新しい数として、
またソートからやるということを繰り返し、数が変わらなくなったら終了します。


このコードを実際に使うと、

桁数を入力してください

4
6174

となり、求まります。