1.问题描述
2000以内的不小于4的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以
内的正偶数成立)。
2.问题分析
根据问题描述,为了验证歌德巴赫猜想对2000以内的正偶数都是成立的,要将整数分解
为两部分,然后判断分解出的两个整数是否均为素数。若是,则满足题意,否则应重新进行
分解和判断。
针对该问题,我们可以给定如下的输入和输出限定。
输入时:每行输入一组数据,即2000以内的正偶数n,一直输入到文件结束符为止。
输出时:输出n能被分解成的素数a和b。如果不止一组解,则输出其中a最小的那组解。
当然,读者可以根据实际的需要规定不同的输入和输出形式。
输入示例:

4
6
8
10
12
输出示例:
2 2
3 3
3 5
3 7
5 7
3.算法设计

本问题我们可以采用函数来解决。
(1)fun(n)函数判断输入的n值是否为素数
定义一个函数,函数名设为fun,在其中判断传进来的形参——设为n(n≥2),是否为素
数,如果是素数则返回1,否则返回0。在判断是否为素数时,可以采用5.1节中介绍的方法。
需要注意的是,在所有偶数中,只有2是唯一的素数。因此,在函数fun()中,可以分为以下4
种情况来判断:
·n=2,是素数,返回1。
·n是偶数,不是素数,返回0。
·n是奇数,不是素数,返回0。
·n≠2,是素数,返回1。
(2)guess(n)函数用于验证哥德巴赫猜想
由于我们已经对输出做了限定,即当输出结果时,如果有多组解,则输出a最小的那组
解。显然,对每个读入的数据n,a必然小于或等于n//2,因此,定义循环变量i,使其从2~n/2
进行循环,每次循环都做如下判断:fun(i) and fun(n-i)是否为1。
如果fun(i) and fun(n-i)=1,则表示fun(i)=1同时fun(n-i)=1。由fun()函数的定义可知,此时i
和n-i都为素数,又由于i是从2~n/2按由小到大的顺序来迭代的,因此,(i,n-i)是我们求出
的一组解,且该组解必然是所有可能解中a值最小的。
还需要注意的是,由于除了2以外的偶数不可能是素数,因此,i值的可能取值只能是2和
所有的奇数。
4.确定程序框架
(1)程序主框架
程序的主框架是一个while循环,每输入一个数据就处理一次,直到人为结束程序或输入
非法数据而终止输入。代码如下:

while True: # 循环输入
n = int(input())
guess(n) # 调用函数验证哥德巴赫猜想

(2)使用函数判断n是否为素数
在算法设计中我们详细介绍了fun()函数,它的功能就是判断传进来的形参n是否为素数,
其代码如下:

# 判断是否为素数
def fun(n):
if n == 2:
return 1 # n是2,返回1
if n % 2 == 0:
return 0 # n是偶数,不是素数,返回0
i = 3
while i <= math.sqrt(n):
if n % i == 0:
return 0 # n是奇数,不是素数,返回0
i += 2
return 1 # n是除2以外的素数,返回1

(3)使用函数验证哥德巴赫猜想
在算法设计中,我们介绍了guess()函数,它的功能就是验证传入的参数n是否满足哥德巴
赫猜想,其代码如下:

# 验证哥德巴赫猜想
def guess(n):ok = 0 # 进入循环前先置标志位i = 2while i <= (n // 2):if fun(i):if fun(n - i):print("%d %d\n" % (i, n - i)) # i和n-i都是素数,则打印ok = 1if i != 2:i += 1if ok:break # 已打印出所需要的输出结果,跳出循环

程序的流程图如图5.3所示。

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 哥德巴赫猜想
import math
# 判断是否为素数
def fun(n):if n == 2:return 1 # n是2,返回1if n % 2 == 0:return 0 # n是偶数,不是素数,返回0i = 3while i <= math.sqrt(n):if n % i == 0:return 0 # n是奇数,不是素数,返回0i += 2return 1 # n是除2以外的素数,返回1# 验证哥德巴赫猜想def guess(n):ok = 0 # 进入循环前先置标志位i = 2while i <= (n // 2):if fun(i):if fun(n - i):print("%d %d\n" % (i, n - i)) # i和n-i都是素数,则打印ok = 1if i != 2:i += 1if ok == 1:break # 已打印出所需要的输出结果,跳出循环i += 1if __name__ == "__main__":while True: # 循环输入n = int(input())guess(n) # 调用函数验证哥德巴赫猜想

6.运行结果
在PyCharm下运行程序,分别输入4、6、8、10、12,每输入一个数据后,按Enter键则立
即打印出该数据的结果,如图5.4所示。

7.问题拓展
在该问题中我们定义了fun()函数来判断数n是否为素数,在fun()函数中,针对n的奇偶性
进行了不同的处理,只要n是偶数,则肯定不是素数,这样就只需对n是奇数的情况进行判
断,如下面的代码中加粗部分所示:

# 判断是否为素数
def fun(n):if n == 2:return 1 # n是2,返回1if n % 2 == 0:return 0 # n是偶数,不是素数,返回0i = 3while i <= math.sqrt(n):if n % i == 0:return 0 # n是奇数,不是素数,返回0i += 2return 1 # n是除2以外的素数,返回1

如果n是奇数,则n包含的因子也只能为奇数,否则n就应该是偶数,因此循环变量i每次
自增2,且i的变化范围为 。使用这种方式来判断素数,与从 逐个比较相比,进一
步缩小了比较范围,处理速度也进一步获得了提高。

100个python算法超详细讲解:哥德巴赫猜想相关推荐

  1. 100个python算法超详细讲解:搬山游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 设有n座山,计算机与人作为比赛的双方,轮流搬山.规定每次搬 山数不能超过k座,谁搬最后一座谁输.游戏开始时,计算机请人输入 山的总数n和 ...

  2. 100个python算法超详细讲解:平分7筐鱼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 2.乙.丙三位渔夫出海打鱼,他们随船带了21只箩筐.当晚返航时, 他们发现有7筐装满了鱼,还有7筐装了半筐鱼,另外7筐是空的,由于他们 ...

  3. 100个python算法超详细讲解:邮票组合

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 我们寄信都要贴邮票,在邮局有一些小面值的邮票,通过这些小 面值邮票中的一张或几张的组合,可以满足不同邮件的不同邮资.现 在,邮局有4种不 ...

  4. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  5. 100个python算法超详细讲解:谁是窃贼

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 警察审问4名窃贼嫌疑犯.现在已知,这4人当中仅有一名是窃 贼,还知道这4个人中的每个人要么是诚实的,要么总是说谎. 下面是这4个人给警察 ...

  6. 100个python算法超详细讲解:抢30游戏

    [100个python算法超详细讲解]@谷歌学术 1.问题描述 由两个人玩"抢30"游戏,游戏规则是:第一个人先说"1"或"1,2",第 二 ...

  7. 100个python算法超详细讲解:卡布列克常数

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 对于任意一个4位数n,进行如下的运算: 1)将组成该4位数的4个数字由大到小排列,形成由这4个数字构 成的最大的4位数. 2)将组成该4 ...

  8. 100个python算法超详细讲解:孪生素数

    [100个python算法超详细讲解@谷哥技术] 1.问题描述 本节要研究孪生素数的问题,先来看看什么是孪生素数. 所谓孪生素数指的是间隔为2的两个相邻素数,因为它们之间的距离已经 近得不能再近了,如 ...

  9. 100个python算法超详细讲解:狼追兔子

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一只兔子躲进了10个环形分布的洞中的某一个.狼在第一个洞中 没有找到兔子,就隔一个洞,到第三个洞中去找:如果没有找到,就 隔两个洞,到第 ...

  10. 100个python算法超详细讲解:猴子吃桃

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 一个猴子摘了一些桃子,它第一天吃掉了其中的一半然后再多吃了 一个,第二天照此方法又吃掉了剩下桃子的一半加一个,以后每天如 此,直到第十天 ...

最新文章

  1. 下次激活策略10_服装店营销策划方案,简单策略让服装超市提升10倍业绩
  2. selenium python实例录制运行_WEB自动化测试工具selenium录制器使用笔记
  3. (译)C++11中的Move语义和右值引用
  4. vue.js 表单 v-text
  5. 【论文复现】使用CNN进行文本分类
  6. Python(十七):python的编程规范、PEP8
  7. c语言 10个小程序,分享10个基础C语言的小程序
  8. logistic回归 如何_Logistic回归分析之二元Logistic回归
  9. openwrt路由器完美破解成信宿舍校园网
  10. 废旧手机改造成好玩的天气暗示相框
  11. OTA三种差分算法安装使用。bsdiff,hdiffpatch,xdelta3
  12. 龙年贺词成语-龙字成语
  13. 华为称鸿蒙系统支持第三方手机,“开源开放毫无保留”,欢迎厂商使用
  14. linux 控制虚拟串口,linux虚拟串口控制器实现-适用于无开发板学习tty driver-好向圈...
  15. Verilog语言交通灯课程设计
  16. 手写输入法-书法效果图
  17. 中国工程院院士王国法:想实现煤炭完全无人化开采
  18. One-Shot NAS
  19. 怎么将html导入trados,关于Trados的组成和界面
  20. 51单片机的特殊功能寄存器到底在哪,为何51子系列没有高128B仍然有特殊功能寄存器

热门文章

  1. python小老鼠编程_昆山编程语言哪家实惠,python学习
  2. 百度7天GNN学习-实战1(基于空手道俱乐部的两层GCN节点分类问题)
  3. 波士顿大狗运动仿真-Unity3D
  4. django基础、自定义框架
  5. AI开始卷高考了,英语已被卷到134分??
  6. 【每天学习一点新知识】JNDI注入
  7. Spring注入(Injection)——教你一点一点知道什么是依赖注入及注入方式
  8. Python 探究类的继承的使用
  9. LDR、STR、MOV、B、BL、BX、BLX 和 BXJ
  10. IT实践达人赛携手IBM续写“技术精神”