等差素数数列

程序地址:http://www.cheemoedu.com/exercise/27

问题描述:

类似7、37、67、97、107、137、167、197,这样由素数组成的数列叫做等差素数数列。素数数列具有项数的限制,一般指素数数列的项数有多少个连续项,最多可以存在多少个连续项。
编程找出100以内的等差素数数列。

示例代码:

解题步骤:
#1. 筛法找到100所有素数
#2. 对于素数list内素有俩两组合,构造等差数列a0, a1项
#3. 计算出a2, 查表判断a2是否是素数,是素数则能构成素数等差序列, 计算a3...

def findAllPrime(n):
    pt = [True] * n
    prime = []
    for p in range(2, n):
        if not pt[p]: continue
        prime.append(p)
        for i in range(p * p, n, p):
            pt[i] = False
    return prime, pt
prime, pt = findAllPrime(100)
print prime
for i in range(len(prime)):
    for j in range(i + 1, len(prime)):
        a0, a1 = prime[i], prime[j]
        an = a1 + a1 - a0
        s = []
        while an < 100 and pt[an]:
            s.append(an)
            an += a1 - a0
        if s:
            print [a0, a1] + s

结果:

[3, 5, 7] [3, 7, 11] [3, 11, 19] [3, 13, 23] [3, 17, 31] [3, 23, 43] [3, 31, 59] [3, 37, 71] [3, 41, 79] [3, 43, 83] [5, 11, 17, 23, 29] [5, 17, 29, 41, 53] [5, 23, 41, 59] [5, 29, 53] [5, 47, 89] [7, 13, 19] [7, 19, 31, 43] [7, 37, 67, 97] [7, 43, 79] [11, 17, 23, 29] [11, 29, 47] [11, 41, 71] [11, 47, 83] [13, 37, 61] [13, 43, 73] [17, 23, 29] [17, 29, 41, 53] [17, 53, 89] [19, 31, 43] [19, 43, 67] [23, 41, 59] [23, 47, 71] [23, 53, 83] [29, 41, 53] [29, 59, 89] [31, 37, 43] [37, 67, 97] [41, 47, 53, 59] [43, 61, 79, 97] [47, 53, 59] [47, 59, 71, 83] [53, 71, 89] [59, 71, 83] [61, 67, 73, 79] [61, 79, 97] [67, 73, 79]

代码分析:

根据它的解题步骤来说,先是求出100以内的所有素数放到列表prime中,然后对列表中素数两两组合构造成等差数列的a0和a1项(实现方法就是用两个for循环,第一个循环从列表开始到结束,第二个循环从第一个开始位置加一道结束),现在已经知道了等差数列的两项,那么公差就是二者之差,第三项就是第二项加公差,然后判断第三项是否小于100且为素数,是的话就是等差素数,并且在根据该值加公差得到下一个数,依次判断即可

详细流程:

官方提供了该题的解题视频:http://www.iqiyi.com/w_19rt5h3qx5.html#vfrm=8-8-0-1

我的代码:

之前打算用an=a1+(n-1)*d的方式来做的,但是发现有问题,后来借鉴了示例代码的解题思路,写出来了,但是发现和示例代码没什么两样,也贴出来吧。

import math
def prime(m):
    count=0
    for i in range(2,int(math.sqrt(m))+1):
        if m%i==0:
            count=1
    if count==1:
        return False
    else:
        return True
x=[]
for j in range(2,100):
    if prime(j):
        x.append(j)
for k in range(len(x)):
    for l in range(k+1,len(x)):
        d=x[l]-x[k]
        res=[]
        an=x[l]+d
        while an<100 and an in x:
            res.append(an)
            an=an+d
        if res:
            print [x[k],x[l]]+res,

结果:

[3, 5, 7] [3, 7, 11] [3, 11, 19] [3, 13, 23] [3, 17, 31] [3, 23, 43] [3, 31, 59] [3, 37, 71] [3, 41, 79] [3, 43, 83] [5, 11, 17, 23, 29] [5, 17, 29, 41, 53] [5, 23, 41, 59] [5, 29, 53] [5, 47, 89] [7, 13, 19] [7, 19, 31, 43] [7, 37, 67, 97] [7, 43, 79] [11, 17, 23, 29] [11, 29, 47] [11, 41, 71] [11, 47, 83] [13, 37, 61] [13, 43, 73] [17, 23, 29] [17, 29, 41, 53] [17, 53, 89] [19, 31, 43] [19, 43, 67] [23, 41, 59] [23, 47, 71] [23, 53, 83] [29, 41, 53] [29, 59, 89] [31, 37, 43] [37, 67, 97] [41, 47, 53, 59] [43, 61, 79, 97] [47, 53, 59] [47, 59, 71, 83] [53, 71, 89] [59, 71, 83] [61, 67, 73, 79] [61, 79, 97] [67, 73, 79]

时间: 2024-10-20 13:08:29

等差素数数列的相关文章

【蓝桥杯】最长等差素数数列

[题目] 在小于10的素数中有3.5.7组成的等差数列,在小于30的素数中有11.17.23.29组成的等差数列. 试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包含的素数个数最多)并打印输出. [关键字] 素数:等差数列 [思路] 先用一个数组标记出 100 ~ 1000 之间哪些是素数: 差值从 2 ~ 900 进行循环判断 [实现] 1 #include <stdio.h> 2 #define N 1001 3 #define MAX_CHA 900 4 5 voi

第二题等差素数列

第二题 标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. #include<iostre

2017第八届蓝桥杯C/C++ B组省赛-等差素数列

标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. 比赛的时候有点混乱,结果连暴力都没暴力

#贪心+等差/比数列&lt;序列&gt;&lt;嚎叫响彻在贪婪的厂房&gt;

1 #include<cstdio> 2 #include<iostream> 3 #include<map> 4 #define MAXN 100010 5 #define ll long long 6 #define maxn(a,b) (a)>(b)?(a):(b) 7 #define minn(a,b) (a)<(b)?(a):(b) 8 using namespace std; 9 inline ll read(){ 10 ll s=0; 11 c

数学问题的解决窍门—素数判定

数学问题的解决窍门 素数判定 所谓素数: 指恰好有2个约数的整数. 判定: 因为n的约数都不超过n, 所以只要检查 2 ~ n-1 的所有整数是否整除n就能判定n是不是素数. 在此,如果d 是 n的约数, 那么 n/d也是n的约数.由n = d * n / d 可知 min(d, n/d) <= 根号n? , 所以只要检查 2 ~ ? 根号n 的所有整数就足够了. 同理可知,整数分解和约数枚举都可以在 O(根号n?) 时间完成.(还有更高效的算法) #include <iostream>

2017第八届蓝桥杯C/C++ B组省赛个人代码

第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的. 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定. 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物. 取款机只能提供100元面额的纸币.小明想尽可能少取些现金,够用就行了. 你的任务是计算出,小明最少需要取多少现金. 以下是让人头疼的购物单,为了保

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

python-趣味百题3

等差素数数列:类似7.37.67.97:107.137.167.197这样由素数组成的数列.素数数列具有项数的限制,一般指素数数列的项数有多少个连续项,最多可以存在多少个连续项编程找出100以内的等差素数数列思路:1.筛法找出100以内所有素数2.对于素数list内两两组合,构造等差数列a0,a1项3.计算出a2,查表判断a2是否有素数,是素数则能构造成素数等差序列,计算a3...def findAllPrime(n):    pt = [True] * n    prime = []    f

第八届蓝桥杯c/c++省赛题目整理

第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的. 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定. 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物. 取款机只能提供100元面额的纸币.小明想尽可能少取些现金,够用就行了. 你的任务是计算出,小明最少需要取多少现金. 以下是让人头疼的购物单,为了保