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

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

从序列 [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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值