数字趣事-组合差恒等于某个值
从序列 [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