python kabulek constant

Problem Description

For any 4-digit number n, perform the following operations:
1. Arrange the 4 numbers that make up the 4-digit number from large to small to form the largest 4-digit number composed of these 4 numbers.
2. Arrange the 4 numbers that make up the 4-digit number from small to large to form the smallest 4-digit number composed of these 4 numbers (if the 4 numbers contain 0, the number obtained is less than 4 digits).
3. Find the difference between these two numbers and get a new 4-digit number (the high-order 0 is reserved). This is called a Kabulek operation on n. There is such a rule: if you repeat the Kabulek operation several times on a 4-digit number whose digits are not all the same, the final result will always be 6174. This kind of number is called the Kabulek number. Please use python programming to prove it. This rule.

        The essence of this problem is: there is a 4-digit number. Find the largest 4-digit max_number composed of 4 digits in number and the smallest 4-digit min_number composed of 4 digits in number. Use max_number minus min_number to get sub_number and check whether sub_number is equal to 6174. If sub_number is not equal to 6174, treat sub_number as number and repeat the above process until sub_number is equal to 6174. In order to prevent sub_number from becoming an infinite loop when sub_number is equal to 0, the operation also needs to end when sub_number is equal to 0.

Find the largest 4-digit number consisting of 4 numbers

        We can convert this 4-digit number into a string, find the largest number from the string each time and put it into a new string, and then remove the largest number from the string. Loop this 4 times to get a new string with a maximum of 4 digits, and then convert this new string into an integer to get a maximum of 4 digits. code show as below:

def max_number(number: int):
    """
    生成number中的4个数字组成的最大4位数
    
    :param number: 一个整数
    :return: 最大4为数
    """
    s_number = str(number).zfill(4)  # 把整数转换为字符串,用zfill处理一下字符串,当number不足4位时,在前面添0补齐
    r_number = ''  # 定义一个新字符串
    for i in range(4):  # 循环4次
        r_number += max(s_number)  # 使用max找出字符串中最大的数字,放到新字符串中
        s_number = s_number.replace(max(s_number), '', 1)  # 把字符串中最大的数字替换为空字符,防止有重复数字,只替换一个
    return int(r_number)  # 返回最大4为数

Find the smallest 4-digit number consisting of 4 numbers

        We can convert this 4-digit number into a string, find the smallest number from the string each time and put it into a new string, and then remove the smallest number from the string. Loop this 4 times to get a new string with a minimum of 4 digits, and then convert this new string into an integer to get a minimum of 4 digits. code show as below:

def min_number(number: int):
    """
    生成number中的4个数字组成的最小4位数

    :param number: 一个整数
    :return: 最小4为数
    """
    s_number = str(number).zfill(4)  # 把整数转换为字符串,用zfill处理一下字符串,当number不足4位时,在前面添0补齐
    r_number = ''  # 定义一个新字符串
    for i in range(4):  # 循环4次
        r_number += min(s_number)  # 使用min找出字符串中最小的数字,放到新字符串中
        s_number = s_number.replace(min(s_number), '', 1)  # 把字符串中最小的数字替换为空字符,防止有重复数字,只替换一个
    return int(r_number)  # 返回最小4为数

Do Kabulek operations

        There is an existing 4-digit number where the digits are not all the same. In a loop, use the max_number function to find the maximum 4-digit b_number of number, and use the min_number function to find the minimum 4-digit l_number of number. Determine whether the result of b_number minus l_number is equal to 6174 or 0. If it is not equal to 6174 or 0, assign the result to number and repeat the above steps (loop). If it is equal to 6174 or 0, end the loop. code show as below:

def cableck_constant(number: int):
    """
    卡布列克常数
    
    :param number: 一个4位正整数
    :return: 
    """
    if type(number) != int:  # 检查number的类型是不是整型
        raise TypeError('number is not int')  # 不是则整型抛出类型错误
    if number < 1000 or number > 9999:  # 检查number的值是不是4位数
        raise ValueError('number range [1000, 9999]')  # 不是则抛出值错误
    while number != 6174 and number != 0:  # 当number等于6174或0时结束循环
        l_number = min_number(number)  # 求出最小4位数
        b_number = max_number(number)  # 求出最大4位数
        number = b_number - l_number  # 把最大4位数和最小4位数的差赋值给number
        print(f'{b_number} - {l_number:4} = {number}')  # 打印一下计算过程

Complete code

        Combine the above three functions to get the complete code:

def min_number(number: int):
    """
    生成number中的4个数字组成的最小4位数

    :param number: 一个整数
    :return: 最小4为数
    """
    s_number = str(number).zfill(4)  # 把整数转换为字符串,用zfill处理一下字符串,当number不足4位时,在前面添0补齐
    r_number = ''  # 定义一个新字符串
    for i in range(4):  # 循环4次
        r_number += min(s_number)  # 使用min找出字符串中最小的数字,放到新字符串中
        s_number = s_number.replace(min(s_number), '', 1)  # 把字符串中最小的数字替换为空字符,防止有重复数字,只替换一个
    return int(r_number)  # 返回最小4为数


def max_number(number: int):
    """
    生成number中的4个数字组成的最大4位数

    :param number: 一个整数
    :return: 最大4为数
    """
    s_number = str(number).zfill(4)  # 把整数转换为字符串,用zfill处理一下字符串,当number不足4位时,在前面添0补齐
    r_number = ''  # 定义一个新字符串
    for i in range(4):  # 循环4次
        r_number += max(s_number)  # 使用max找出字符串中最大的数字,放到新字符串中
        s_number = s_number.replace(max(s_number), '', 1)  # 把字符串中最大的数字替换为空字符,防止有重复数字,只替换一个
    return int(r_number)  # 返回最大4为数


def cableck_constant(number: int):
    """
    卡布列克常数

    :param number: 一个4位正整数
    :return:
    """
    if type(number) != int:  # 检查number的类型是不是整型
        raise TypeError('number is not int')  # 不是则整型抛出类型错误
    if number < 1000 or number > 9999:  # 检查number的值是不是4位数
        raise ValueError('number range [1000, 9999]')  # 不是则抛出值错误
    while number != 6174 and number != 0:  # 当number等于6174或0时结束循环
        l_number = min_number(number)  # 求出最小4位数
        b_number = max_number(number)  # 求出最大4位数
        number = b_number - l_number  # 把最大4位数和最小4位数的差赋值给number
        print(f'{b_number} - {l_number:4} = {number}')  # 打印一下计算过程


cableck_constant(1234)

The execution results are as follows:

Guess you like

Origin blog.csdn.net/qq_40148262/article/details/131082831