每日一练 2022.01.12 python 找出素数对
题目描述
找出素数对
任意输入一个大于10的偶数,编程找出所有和等于该偶数的素数对。一下程序实现了这一功能,请你填补空白处内容:
h=0
def a(h):
x=0
for j in range(2,h):
if h%j==0:
x=1
break
if x==0:
return 1
n=int(input("输入任意大于10的偶数:"))
for i in range(n,n+1):
h=0
if i%2==0:
for k in range(2,i):
if(a(k)==1 and a(i-k)==1):
______________;
以上描述来自题目方便大家阅读和复制验证,以下给出题目原图大家可自行对比(应该没有错误(lll¬ω¬))
由于上述图片不能显示全部代码,所以一下增加一张对代码的补充:
问题描述
题目本身没什么问题,问题在于ta给出的正确答案(先上原图):
题目中h的赋值语句和if else模块是同样的缩进:
for k in range(2,i):
if(a(k)==1 and a(i-k)==1):
h=1
if h==0:
print("%d can not"%i)
break
else:
print("%d=%d+%d"%(i,k,i-k))
break
给定一个大于10的偶数100观察结果:
然而很明显结果只输出了第一个符合要求的素数数对,而没有输出全部素数对。
原因分析:
当寻找到第一个符合的素数对即满足了a(k)==1 and a(i-k)==1
条件,h=1
然后执行else
中的语句,结尾的break
直接退出循环不再寻找符合的素数数对。
解决方案:
for k in range(2,i):
if(a(k)==1 and a(i-k)==1):
h=1
print("%d=%d+%d"%(i,k,i-k))
if h==0:
print("%d can not"%i)
break
改进后的代码在满足条件a(k)==1 and a(i-k)==1
后直接打印数对print("%d=%d+%d"%(i,k,i-k))
然后寻找下一个数对,待循环结束后再判断是否没有符合要求的数对。
运行结果:
但是上述代码还有一个明显的问题是会重复打印,在这里对循环稍微优化一下:
for k in range(2,int(i/2)):
if(a(k)==1 and a(i-k)==1):
h=1
print("%d=%d+%d"%(i,k,i-k))
if h==0:
print("%d can not"%i)
break
将循环上限改为目标的一半:int(i/2)
即可解决上述问题,结果如下:
(第一次写博客有比较粗糙,而且还是代码菜狗,如果有大佬发现上述内容有任何问题欢迎评论区讨论)