PTA 7-4 素数等差数列 (20 分)

简介: 2004 年,陶哲轩(Terence Tao)和本·格林(Ben Green)证明了:对于任意大的 n,均存在 n 项全由素数组成的等差数列。

题目


2004 年,陶哲轩(Terence Tao)和本·格林(Ben Green)证明了:对于任意大的 n,均存在 n 项全由素数组成的等差数列。例如 { 7,37,67,97,127,157 } 是 n=6 的解。本题就请你对给定的 n 在指定范围内找出一组最大的解。


输入格式: 输入在一行中给出两个正整数:n(≤10)为等差素数数列的项数; MAXP (2≤MAXP<10 5 )为数列中最大素数的上界。


输出格式: 如果解存在,则在一行中按递增序输出等差最大的一组解;若解不唯一,则输出首数最大的一组解。若解不存在,则输出不超过 MAXP 的最大素数。同行数字间以一个空格分隔,行首尾不得有多余空格。


输入样例 1:
5 1000
结尾无空行
输出样例 1:
23 263 503 743 983
结尾无空行
输入样例 2:
10 200
结尾无空行
输出样例 2:
199
结尾无空行

解题思路

n, MAXP = map(int,input().split())
# n, MAXP = map(int,"5 1000".split())
# n, MAXP = map(int,"10 2".split())
import math
def isSushu(input:int)->bool:
    if input == 2 or input == 3 or input == 1:
        return True
    sqrtInt = int(math.sqrt(input))
    for i in range(2,sqrtInt+1):
        if input%i == 0:
            return False
    return True
sushuList = []
for i in range(2,MAXP+1):
    if isSushu(i) == True:
        sushuList.append(i)
# print(sushuList)
if len(sushuList) == 0:
    print("")
resList = []
for index,val in enumerate(sushuList):
    for i in sushuList[index+1:]:
        dengcha = i - val
        shifoucunzai = True##是否存在等差数列
        for chengshu in range(1,n):
            dengchashu = val + dengcha*(chengshu)
            if dengchashu not in sushuList:
                shifoucunzai = False
                break
        if shifoucunzai == True:
            resList.append((val, dengcha))
# 有解的数组
resList.sort(key= lambda x:(-x[1],-x[0]))
# print(resList)
if len(resList)>0:#如果解存在,则在一行中按递增序输出等差最大的一组解;若解不唯一,则输出首数最大的一组解。
    num,cha = resList[0]
    res = [str(num+cha*i) for i in range(n)]
    print(" ".join(res))
else:
    try:
        print(str(sushuList[-1]))
    except:
        print("")


目录
相关文章
【动态规划刷题 16】最长等差数列 (有难度) && 等差数列划分 II - 子序列
【动态规划刷题 16】最长等差数列 (有难度) && 等差数列划分 II - 子序列
109 0
|
8月前
|
C++
【PTA】L1-046 整除光棍(C++)
【PTA】L1-046 整除光棍(C++)
89 1
|
9月前
PTA-统计素数并求和
该程序统计并计算1至500之间整数M和N区间内的素数个数和。输入为两正整数M和N,输出为素数个数和它们的和。例如输入10 31,输出7 143。代码通过遍历区间,检查每个数是否能被2到自身-1之间的数整除,若不能则为素数,将其加入列表,最后输出列表长度(素数个数)和列表元素之和(素数和)。
101 0
|
9月前
PTA-第4章-2 统计素数并求和
该代码用于统计并求和给定区间[M, N](1≤M≤N≤500)内的素数。输入包含两整数M和N,输出为素数个数和它们的和。例如,输入10 31,输出7 143。代码通过遍历区间,检查每个数是否能被小于它的数整除来判断是否为素数。
113 0
|
9月前
|
C++
【PTA】L1-025 正整数A+B (C++)
【PTA】L1-025 正整数A+B (C++)
147 0
【PTA】L1-025 正整数A+B (C++)
|
9月前
|
C++
【PTA】​ L1-080 乘法口诀数列​(C++)
【PTA】​ L1-080 乘法口诀数列​(C++)
108 0
【PTA】​ L1-080 乘法口诀数列​(C++)
|
9月前
PTA-求指定范围内的素数
求指定范围内的素数
104 0
|
9月前
PTA-求100以内的素数
求100以内的素数
71 0