python-素数中的等差数列

题目描述

质数是在数论中很有意思的数,有很多题都可以围绕它来出,就如你眼前所见的这道题。

给定一个闭区间 [a,b] ,将此范围内的所有素数进行从小到大排序,对于连续的素数,我们可以发现很多等差数列(元素个数大于等于 3 ),现在就请你完成这个任务。

对于给定的闭区间 [a,b] ,你要找出里面所有的等差数列,并输出所有的等差数列。

这里有一个要求,同一个数不能同时存在于两个等差数列中。

比如 a,b,c,d,e 中, a,b,c 是一个等差数列, c,d,e 也是一个等差数列,后一个等差数列就不能以 c 开始,所以 c,d,e 在本题不构成等差数列。
输入格式

输入占一行,只包含两个数 a 和 b ,并用空格隔开。
输出格式

输出占若干行,每行为一个等差数列,每个数用空格隔开。
样例输入输出
样例输入

141 400
样例输出

151 157 163

167 173 179

199 211 223

251 257 263 269

367 373 379
数据范围

对于 100% 的数据,保证 a<b,a≤1000,b≤100000 。

来源/分类(难度系数:三星 )
质数 模拟 NOIP普及组

完整代码展示:

def prime(i):

j=2

k=int(pow(i,0.5))

while j<=k:

if i%j==0:

break

j+=1

if j>k:

return 1

else:

return 0

def AP(j):

s=[]

m=max(j)

n=min(j)

l=int((m-n)/(len(j)-1))

for i in range(0,len(j)):

s.append(n+i*l)

if s==j:

return 1

else:

return 0

x=[]

a,b=map(int,input().split())

for i in range(a,b+1):

if prime(i)==1 and i>=2:

x.append(i)

y=[]

for i in range(0,len(x)-3):

for j in range(i+3,len(x)):

z=x[i:j]

if len(y)==0:

if AP(z)==1:

y.append(z)

else:

if AP(z)==1 and y[-1][0]==z[0] and len(z)>len(y[-1]):

y[-1]=z

elif AP(z)==1 and min(z)>max(y[-1):

y.append(z)

for i in range(0,len(y)):

sum=""

for j in range(0,len(y[i])):

sum+="{} ".format(y[i][j])

print(sum)

python 复制代码
def prime(i):
    j=2
    k=int(pow(i,0.5))
    while j<=k:
        if i%j==0:
            break
        j+=1
    if j>k:
        return 1
    else:
        return 0
def AP(j):
    s=[]
    m=max(j)
    n=min(j)
    l=int((m-n)/(len(j)-1))
    for i in range(0,len(j)):
        s.append(n+i*l)
    if s==j:
        return 1
    else:
        return 0
x=[]
a,b=map(int,input().split())
for i in range(a,b+1):
    if prime(i)==1 and i>=2:
        x.append(i)
y=[]
for i in range(0,len(x)-3):
    for j in range(i+3,len(x)):#将i+3错误写为3,导致出现:ZeroDivisionError
        z=x[i:j]
        if len(y)==0:
            if AP(z)==1:
                y.append(z)
        else:
            if AP(z)==1 and y[-1][0]==z[0] and len(z)>len(y[-1]):#尽可能地延长等差数列
                y[-1]=z
            elif AP(z)==1 and min(z)>max(y[-1]):#保证数列符合所给条件
                y.append(z)     
for i in range(0,len(y)):
    sum=""
    for j in range(0,len(y[i])):
        sum+="{} ".format(y[i][j])
    print(sum)

代码解释:

"def prime(i):

j=2

k=int(pow(i,0.5))

while j<=k:

if i%j==0:

break

j+=1

if j>k:

return 1

else:

return 0 ",根据素数的定义自定义一个函数prime(),用于判断prime()函数中实参是否为素数:如果是,则返回值1,否则返回值0。

"def AP(j):

s=[]

m=max(j)

n=min(j)

l=int((m-n)/(len(j)-1))

for i in range(0,len(j)):

s.append(n+i*l)

if s==j:

return 1

else:

return 0 ",根据等差数列的定义自定义一个函数AP(),用于判断AP()中的实参是否为等差数列,如果是:则返回值1,否则返回值0。

"x=[]

a,b=map(int,input().split())

for i in range(a,b+1):

if prime(i)==1 and i>=2:

x.append(i) ",建立一个空列表x,接着导入用户给定的闭区间[a,b]。遍历a~b的所有数字,将属于素数的数字添加进列表x中。

"y=[]

for i in range(0,len(x)-3):

for j in range(i+3,len(x)):

z=x[i:j]

if len(y)==0:

if AP(z)==1:

y.append(z)

else:

if AP(z)==1 and y[-1][0]==z[0] and len(z)>len(y[-1]):

y[-1]=z

elif AP(z)==1 and min(z)>max(y[-1]):#保证数列符合所给条件

y.append(z) ",建立一个空列表y,接着遍历x中元素,按顺序截取元素个数大于等于三的数列。如果y列表为空,则将第一个符合等差数列的数列添加进y中;否则1:判断新查找得到的等差数列与y中的最后一个数列y[-1]是否有重复元素,如果没有,则将其添加进y中。2:判断新查找得到的等差数列的第一个元素与y中最后一个元素y[-1]的第一个元素相同且该数列的长度大于y[-1],如果是,则将该数列替换y[-1]。

"for i in range(0,len(y)):

sum=""

for j in range(0,len(y[i])):

sum+="{} ".format(y[i][j])

print(sum) ",遍历y中元素:建立一个空字符串sum,sum依次连接y[i]中的元素,最终打印sum。

运行效果展示:

(声明:以上内容均为原创)

相关推荐
wengqidaifeng3 小时前
数据结构(三)栈和队列(上)栈:计算机世界的“叠叠乐”
c语言·数据结构·数据库·链表
静听山水3 小时前
Redis核心数据结构
数据结构·数据库·redis
喵手3 小时前
Python爬虫实战:针对Python官网,精准提取出每一个历史版本的版本号、发布日期以及对应的文档/详情页链接等信息,并最终清洗为标准化的CSV文件!
爬虫·python·爬虫实战·零基础python爬虫教学·python官方数据采集·采集历史版本版本号等信息·导出csv文件
Physicist in Geophy.3 小时前
一维波动方程(从变分法角度)
线性代数·算法·机器学习
im_AMBER3 小时前
Leetcode 115 分割链表 | 随机链表的复制
数据结构·学习·算法·leetcode
Liue612312313 小时前
【YOLO11】基于C2CGA算法的金属零件涂胶缺陷检测与分类
人工智能·算法·分类
数智工坊3 小时前
【数据结构-树与二叉树】4.7 哈夫曼树
数据结构
databook3 小时前
像搭积木一样思考:数据科学中的“自下而上”之道
python·数据挖掘·数据分析
!!!!8133 小时前
蓝桥备赛Day1
数据结构·算法
Mr_Xuhhh3 小时前
介绍一下ref
开发语言·c++·算法