[蓝桥杯2022初赛] 寻找整数

题目如下:

 题目分析:

一开始以为是暴力求解,打完字典后开始暴力,结果小瞧了这题目,根本跑不出来。我这里可以先给出答案为

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值