こんにちは。
今回は知人の課題で出されたカプレカ数を求めるプログラムについて書きたいと思います。
カプレカ数?ってなるのが普通だと思うので、まずカプレカ数について説明します。
カプレカ数とは、整数の桁を並び替えて、最大のものから最小のものを引いたときに元の値となる数のことを言います。
例えば、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
となり、求まります。