为了账号安全,请及时绑定邮箱和手机立即绑定

用python打印50-100素数时为什么else要放在外面?

用python打印50-100素数时为什么else要放在外面?

尚方宝剑之说 2019-02-26 02:16:36
import mathfor i in range(50,100+1): for t in range(2,int(math.sqrt(i))+1): if i % t == 0: break else: print(i) 如果我这样写,打印出来的就是51,53,53,53,53,53.... import mathfor i in range(50,100+1): for t in range(2,int(math.sqrt(i))+1): if i % t == 0: break else: print(i) 当我把else拿出来的时候结果就正确了....但是我觉得这不符合逻辑啊?不是应该在for循环里面就打印吗?如果拿出来还在for循环里面吗?
查看完整描述

3 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

ok,我们分两点来说:
1、你的算法逻辑上有问题。

for t in range(2,int(math.sqrt(i))+1):
    if i % t == 0:
        break
    else:
        print(i)

你这段代码的目的是为了判断是否存在除1和本身外的其他约数。但是一旦i不能被t整除你就打印,这就错了,应该是整个for循环结束仍不存在其他约数才打印,比如99不能被2整除,在你这里就打印了,显然是错的。所以正确的做法是判断循环是否完成。怎么判断呢,一种是进行计数与int(math.sqrt(i))+1比较或者非正常结束打标记,但是python有更好的方法。这就要说到第二点。
2、for……else语法,当for正常结束时执行else语句。这就是为什么你把else拿到外面一层结果正确的原因。

查看完整回答
反对 回复 2019-03-01
?
哔哔one

TA贡献1854条经验 获得超8个赞

Python for的语法,执行完循环条件之后,会进入else分支执行。

for i in range(3):
    print(i)
else:
    print(i)

结果:
0
1
2
2

查看完整回答
反对 回复 2019-03-01
?
繁星coding

TA贡献1797条经验 获得超4个赞

当i=51时,内层循环:
t=2, 不能整除,你print(i)
t=3, 可以整除,你break
......
实际上,51不是素数,你只判断了一次不能被2整除,就print了。正确的做法是:2-8 都不能整除才print。

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 842 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信