蓝桥杯等差素数列(暴力)

该博客探讨了数论中的一个著名问题,即存在任意长度的素数等差数列。作者利用编程实现了一个暴力搜索算法,寻找长度为10的等差素数数列,其公差最小值。通过遍历和标记素数,双重循环查找首项和公差,最终找到了满足条件的数列,并输出了最小公差。这是一个结合数学和编程的有趣问题,展示了数论在实际问题中的应用。
摘要由CSDN通过智能技术生成

1. 问题描述:

2,3,5,7,11,13,....是素数序列。类似:7,37,67,97,127,157 这样全由素数组成的等差数列,叫等差素数数列。 上边的数列公差为30,长度为6。 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列。 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 

输出
输出一个整数表示答案 

来源:http://oj.ecustacm.cn/problem.php?id=1326

2. 思路分析:

对于这种尝试性的题目,暴力就行。分析题目可以知道我们首先需要求解出足够多的素数,这样才可以尝试求解出长度为10的等差素数列。声明一个长度为10000的列表(如果计算不出结果那么长度可以小一点),在循环中判断当前遍历的数字是否是素数,如果是素数那么将当前的位置标记为1,标记素数的目的是为了能够通过下标对应的值判断出当前的数字是否素数,等差素数列需要首项和公差,所以需要使用两层循环表示首项和公差,然后在长度为小于10的循环中通过找出起始数字为j,公差为i的等差数列是否全部为素数,如果发现序列中有不是素数的情况那么直接break因为这个时候无法满足素数列的要求,最后判断长度是否等于10即可,答案是210

3. 代码如下:

def solve():
    count = 0
    # 标记出素数列表
    n = 100000
    primes = [0] * n
    # 记录求解出的长度为10的等差素数列
    res = [0] * 10
    for i in range(2, n + 1):
        j, f = 2, 1
        # 判断当前的数字是否是素数
        while j * j <= i:
            if i % j == 0:
                f = 0
                break
            j += 1
        # 当前的数字为素数那么标记对应位置为1
        if f == 1:
            primes[i] = 1
    # print(primes)
    # 公差
    for i in range(1, n + 1):
        # 起始数字
        for j in range(2, n + 1):
            # 长度为10
            count = 0
            # 注意需要判断是否存在越界j + count * i < n
            while count < 10 and j + count * i < n:
                res[count] = j + count * i
                if j + count * i < n and primes[j + count * i] == 0:
                    break
                count += 1
            if count == 10:
                # 输出公差和首项
                print(i, j)
                return res


if __name__ == '__main__':
    print(solve())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值