质数距离和_蓝桥杯05_16浅浅打个卡

 

"""
这个题用的变量有点乱
主要颓废一天一点也不想写,我就不再重新敲了,因为这题比较简单
"""

n = int(input())
A = list(map(int, input().split()))


# 线性筛
def is_p(a):
    """
    :param a: 筛选出1~a之间的质数
    :return: 
    """
    # li: 当是素数的时候,在列表中的该位置存放的是相应的素数,当该值不是素数的时候存储的是 0
    # li:列表与普通的线性筛不同,这样是为了方便后面的操作
    li = [0, 0]
    # vis:做标记数组,这里当为0 是表示没有标记过是素数
    # 如果该位置被标记,则说明不是素数
    vis = [0] * (a + 1)
    vis[0] = vis[1] = 1
    # lis:列表存放的是素数,这个;lis列表只在线性筛的时候用到了
    lis = []
    for i in range(2, a + 1):
        if vis[i] == 0:
            lis.append(i)
            li.append(i)
        else:
            li.append(0)
        for x in lis:
            if x * i > a:
                break
            vis[x * i] = 1
            if i % x == 0:
                break
    return li, vis


# 这里面的数据9100是根据题目给的范围来给的
li, vis = is_p(91000)

# 下面的过程是题目的模拟过程
ans = 0
for i in range(n):
    # 如果是质数则直接跳过
    if vis[A[i]] == 0:
        continue
    ant = 1e9
    j = k = A[i]
    while True:
        # 这里需要注意边界问题,一开始我都忘记了
        if j >= 0 and li[j] != 0:
            b = li[j]
            break
        j -= 1

    while True:
        # 这里需要注意边界问题,一开始俺都忘记了
        if k < 91000 and li[k] != 0:
            c = li[k]
            break
        k += 1
    # 找出当下的数 左右两边的质数距离较近的那一个
    ant = min(A[i] - b, c - A[i])
    ans += ant
print(ans)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值