P1579 哥德巴赫猜想(升级版)Python 埃拉托斯特尼筛法

哥德巴赫猜想(升级版)

题目背景

1742 年 6 月 7 日,哥德巴赫写信给当时的大数学家欧拉,正式提出了以下的猜想:任何一个大于 9 9 9 的奇数都可以表示成 3 3 3 个质数之和。质数是指除了 1 1 1 和本身之外没有其他约数的数,如 2 2 2 和 11 11 11 都是质数,而 6 6 6 不是质数,因为 6 6 6 除了约数 1 1 1 和 6 6 6 之外还有约数 2 2 2 和 3 3 3。需要特别说明的是 1 1 1 不是质数。

这就是哥德巴赫猜想。欧拉在回信中说,他相信这个猜想是正确的,但他不能证明。

从此,这道数学难题引起了几乎所有数学家的注意。哥德巴赫猜想由此成为数学皇冠上一颗可望不可及的"明珠"。

题目描述

现在请你编一个程序验证哥德巴赫猜想。

先给出一个奇数 n n n,要求输出 3 3 3 个质数,这 3 3 3 个质数之和等于输入的奇数。

输入格式

仅有一行,包含一个正奇数 n n n,其中 9 < n < 20000 9 < n < 20000 9<n<20000。

输出格式

仅有一行,输出 3 3 3 个质数,这 3 3 3 个质数之和等于输入的奇数。相邻两个质数之间用一个空格隔开,最后一个质数后面没有空格。如果表示方法不唯一,请输出第一个质数最小的方案,如果第一个质数最小的方案不唯一,请输出第一个质数最小的同时,第二个质数最小的方案。

样例 #1

样例输入 #1

复制代码
2009

样例输出 #1

复制代码
3 3 2003

直接判断素数的方法是会超时的。

使用埃拉托斯特尼筛法,把素数都选出来,再加和

python 复制代码
n = int(input())

def erato(n):
    prime = [True for i in range(n+1)]
    p = 2
    while p**2<=n:
        if prime[p] == True:
            for i in range(p**2,n+1,p):
                prime[i] = False
        p+=1
    s = []
    for i in range(2,n+1):
        if prime[i]:
            s.append(i)
    return s
s = erato(n)
temp = 0
for i in s:
    for j in s:
        for k in s:
            if i+j+k==n:
                a,b,c = i,j,k
                temp = 1
                break
        if temp == 1:
            break
    if temp == 1:
        break
print(a,b)
相关推荐
im_AMBER2 分钟前
Leetcode 34
算法·leetcode
im_AMBER8 分钟前
Leetcode 31
学习·算法·leetcode
吃着火锅x唱着歌32 分钟前
LeetCode 74.搜索二维矩阵
算法·leetcode·矩阵
mit6.82436 分钟前
hash|快速幂|栈
算法
OG one.Z40 分钟前
06_决策树
算法·决策树·机器学习
爪哇部落算法小助手1 小时前
每日两题day23
算法
妮妮喔妮2 小时前
10.25复习LRU缓存[特殊字符]
算法
linff9112 小时前
hot 100 技巧题
数据结构·算法·leetcode
暴风鱼划水2 小时前
卡码网语言基础课(Python) | 19.洗盘子
python·算法
会编程是什么感觉...2 小时前
算法 - PEC校验
单片机·算法