数字趣事-组合差恒等于某个值

数字趣事-组合差恒等于某个值

从序列 [0-9] 10个数字中取 4 个元素进行组合、元素不允许重复
组成的最大值-最小值(最小值不能以0开头),得到的结果,重复此操作,直到结果不变

N = 3 得到的结果都是 495,有一个特例 (0,4,7) 结果是0
N = 4 得到的结果都是 6174

比如:随机选取 1 3 5 9 这四个数
取最大值和最小值 9531-1359=8172
再取最大值和最小值 8721-1278=7443
重复这个过程 ==>> 7443-3447=3996 9963-3699=6264 6642-2466=4176 7641-1467=6174 后边永远是 6174

import itertools as it
import time


def convert_2_int(arr_int):
    str_arrays = list(map(str, arr_int))
    combined_str = "".join(str_arrays)
    return int(combined_str)

def convert_2_array(val_int):
    num_str = str(val_int)
    return [int(v) for v in num_str]

def not_0_begin(int_arrays):
    not_0_index = 0
    for i in range(len(int_arrays)):
        if int_arrays[i] != 0:
            not_0_index = i
            break
    if not_0_index != 0:
        int_arrays[0], int_arrays[i] = int_arrays[i], int_arrays[0]            


def delta(values):
    values.sort()
    not_0_begin(values)
    min_val = convert_2_int(values)

    values.sort(reverse=True)
    max_val = convert_2_int(values)
    # print(max_val, min_val, max_val - min_val)
    return max_val - min_val


# 从序列 [0-9] 10个数字中取 N 个元素进行组合、元素不允许重复
# 组成的最大值-最小值(不能以0开头),得到的结果,重复此操作,直到结果不变
# N = 1,2 得到的结果都是 0
# N = 3 得到的结果都是 495,有一个特例 (0,4,7) 结果是0
# N = 4 得到的结果都是 6174
def combin_sub(count):
    result_all = {}
    last_result=None
    total_count = 0
    for result_beg in it.combinations([x for x in range(10)], count):
        total_count += 1
        result = list(result_beg)
        try_count = 100
        # 循环计算最大值-最小值,直到结果不变,为了防止死循环,这里最多100次, count >= 5 时,会写入死循环
        while(try_count > 0):
            try_count -= 1           
            result = delta(result)
            # print(last_result, result)
            if last_result == result:
                break
            last_result = result
            result = convert_2_array(result)

        if try_count > 0:  # 得到有效结果
            result_key = last_result
            if result_key in result_all:
                result_all[result_key].append(result_beg)
            else:
                result_all[result_key] = [result_beg]
        else:
            # print(f"{result_beg} not have result")
            pass
    return total_count, result_all


if __name__ == "__main__":
    for count in range(1, 5):
        print(f"=======calc: count {count}")
        beg_time = time.time()
        (total_count ,result_all) = combin_sub(count)
        for v in result_all:
            print(f"{v}, {len(result_all[v])}")
            if len(result_all[v]) < 10:
                print(f"{v}, {result_all[v]}")
        print(f"calc: count {count},{total_count} cost: {time.time() - beg_time: .3} s \n")


#   result
# =======calc: count 1
# 0, 10
# calc: count 1,10 cost:  9.7e-05 s 

# =======calc: count 2
# 0, 45
# calc: count 2,45 cost:  0.000678 s 

# =======calc: count 3
# 495, 119
# 0, 1
# 0, [(0, 4, 7)]
# calc: count 3,120 cost:  0.00187 s 

# =======calc: count 4
# 6174, 210
# calc: count 4,210 cost:  0.00633 s 

你可能感兴趣的:(数学,python,开发语言)