题目如下:
题目分析:
一开始以为是暴力求解,打完字典后开始暴力,结果小瞧了这题目,根本跑不出来。我这里可以先给出答案为
2022040920220409
这样子的数字以1为间隔或者三位数间隔是根本不可能在考试中遍历出来。
所以开始查阅资料,发现准确解法为中国剩余定理。
参考博客:
中国剩余定理学习笔记 - MashiroSky - 博客园 (cnblogs.com)
这里不再赘述原理了。
由这个方法直接写出程序比较简单,下面是代码,不过还是有困难的地方,我指出我遇到的两个问题。
def minf(sum,div):
add = sum
while True:
if (sum%div==1):
return sum
sum += add
return -1
arr = {2:1,3:2,5:4,7:4,13:10,19:18,23:15,29:16,31:27,37:22,41:1,43:11,47:5}
keys = list(arr.keys())
condition = list(arr.values())
minDiv = 1
for i in range(len(arr)):
minDiv *= keys[i]
res = 0
for i in range(len(arr)):
tem = minDiv//keys[i]
res += condition[i]*minf(tem,keys[i])
print(res)
print(minDiv)
res = res%minDiv
print(res)
flag = True
for i in range(len(arr)):
if (res%keys[i]!=condition[i]):
flag = False
print("no")
break
if (flag):
print("yes")
困难1.直接把所有数字作为字典,会导致计算量陡增,时间好久。
因此,还找到了一个定理:
只需要保留所有的质素(素数)就可以了,因为非质数肯定有一个质素因子,只要符合这个质素因子的条件,自然就符合这个非质数的条件了
不给出证明和解释,因为我也不懂。
困难2.在运算过程中要时刻保持浮点数陷阱,比如这行代码不能写成这样:
tem = minDiv//keys[i]
tem = minDiv/keys[i]
因为除法会自动转化为浮点数,导致后面的数字运算错误。
运算结果如下:
182871976975659059
3288180655553430
2022040920220409
yes