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。

运行效果展示:

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

相关推荐
Hylan_J3 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
莫忘初心丶3 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
计算机小白一个4 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^4 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
失败尽常态5236 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447746 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农6 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!7 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉7 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode