作者nknuukyo (我无所能因敌成体)
看板Python
标题[问题] 质数_巢状回圈_菲丝恩
时间Wed Aug 9 14:28:15 2017
各位前辈好,
最近在看python的一些入门书,第二本我是选《菲丝恩教你学会python》,
觉得他们编的不错,但有些小bug不确定是自已还是书本的问题,想请各位前辈帮忙指点
。
过去很少用巢状写质数,本来以为bug在缩排,但没检查到。
程式码如下:
===
i=j=1
for i in range(2,100,1):
for j in range(2,int(i/j)+1):
if(not i%j):
break
if j>i**0.5:
print('%d is prime'%(i))
===
输出为:
2 is prime
3 is prime
7 is prime
11 is prime
13 is prime
17 is prime
19 is prime
23 is prime
29 is prime
31 is prime
37 is prime
41 is prime
43 is prime
47 is prime
53 is prime
59 is prime
61 is prime
67 is prime
71 is prime
73 is prime
79 is prime
83 is prime
89 is prime
97 is prime
===
我试着在程式码里面加一些内容,呈现i跟j的状态,
但都不会跑出5是质数,会说i=5时,非质数,j=2。
不是很搞得清楚bug在哪里,还请前辈们慧眼点明~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 124.9.52.34
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1502260099.A.AFE.html
1F:→ nknuukyo: 使用版本为3.6.108/09 14:29
※ 编辑: nknuukyo (124.9.52.34), 08/09/2017 14:29:54
2F:推 tsoahans: int(i/j)+1改int(i/j)+208/09 15:32
3F:推 CaptainH: i/j 这是错的08/09 16:58
4F:推 stucode: 这问题网站上就有勘误资讯 不过我也不懂i/j那边的逻辑08/09 19:06
5F:→ bruce0209: for j 的前一行加上08/09 20:35
6F:→ bruce0209: print("i:"+str(i)+" j:2~"+str(int(i/j)+1))08/09 20:35
7F:→ bruce0209: if j>i**0.5的前一行加上08/09 20:36
8F:→ bruce0209: print(str(j)+" > "+str(i**0.5)+" ? ")08/09 20:36
9F:→ bruce0209: 应该就不会找不到BUG了吧...08/09 20:38
10F:→ bruce0209: 话说我也不懂i/j的原因 求解08/09 20:38
11F:→ mikapauli: 最小就近似根号i,随便给个上限而已吧。想法很奇怪就是08/09 20:51
12F:→ uranusjr: 我问一句这是完全照书上打的吗, 如果是的话感觉不算好书08/09 23:06
13F:→ uranusjr: 看了勘误感觉应该是照书上没错, 这种烂 code 也出书...08/09 23:10
14F:→ uranusjr: i/j 写成 int(i**0.5) 应该就看得懂了吧, 这两个等价08/09 23:11
15F:→ uranusjr: 把的最後一个 iteration j = (i/j-1)+1 移项应该就懂了08/09 23:13
16F:→ bruce0209: 懂原义了不过还是很诡异...08/09 23:25
17F:→ bruce0209: j^2=(i**0.5)^2然後移项的意思吧....08/09 23:26
18F:→ bruce0209: 可是 j1 = (i/j2-1)+1 在运作上j1和j2不相等吧...08/09 23:27
19F:推 TitanEric: 我觉得程式逻辑很奇怪…08/10 00:19
20F:→ uranusjr: 是啊, 因为 range 的参数是在初始化时就决定, 所以里面08/10 00:49
21F:→ uranusjr: 的 j 会是「前一个 i iteration」的 j 的最後一个值08/10 00:51
22F:→ uranusjr: 会觉得诡异奇怪是正常的, 因为写出这样的东西要嘛根本08/10 00:52
23F:→ uranusjr: 写错要嘛脑袋打结异於常人, 无论是哪种在一般公司都会被08/10 00:53
24F:→ uranusjr: 电到翻, 别说写书出来卖钱了...08/10 00:53
就几本买来的python书来看,菲丝恩这本很白话,而且例题的难度跟量都很适合初学者,
这也是这类书的两难,懂的人未必很会教,擅长教的人未必很懂。只是这个题目很例外,
我也看了一个上午....XD,一个数一个数代入,才比较理解,但也搞不懂为何选择这个方
式说明巢状结构。
另外如果加上print j,质数通常是算到接近一半的i,而非根号i,这点该书也说,只用f
or的巢状结构要想的很清楚才行。
※ 编辑: nknuukyo (101.15.85.252), 08/10/2017 08:10:21
※ 编辑: nknuukyo (101.15.85.252), 08/10/2017 08:15:17
25F:→ bibo9901: 因为i是偶数时, j只会跑到2. 所以下一个i(奇数)时, 就会 08/10 08:31
26F:推 bibo9901: 使j介於2~i/2, 这个上限大於sqrt(i), 所以大部份是对的 08/10 08:33
27F:推 APM99: 这篇写法是很标准的求质数方法阿 不诡异吧 08/10 08:50
29F:→ APM99: 非常标准的作法 ~~只是2会被忽略掉 没啥差 08/10 09:00
30F:推 APM99: #忘了说 这篇一开始的写法5没印出来是被误差害死的... 08/10 09:23
31F:→ APM99: 尽量避免掉会有误差的写法 08/10 09:25
32F:→ stucode: 看了众位板友解说豁然开朗 原来是i/j是从j>sqrt(i)来的 08/10 10:15
33F:推 APM99: 我中午在发篇文解释一下 这篇方法是高中学的A*B=P求质数法 08/10 10:17
34F:→ nknuukyo: 感谢APM99大~ !! 08/10 10:18
35F:→ stucode: 不过原书code真的写得很不好 勘误版本虽然结果正确 08/10 10:19
36F:→ stucode: 建议原PO看过就好 08/10 10:20
37F:→ APM99: 我的写法是错的! 我没避免掉误差 08/10 10:31
38F:→ APM99: 可惜我现在没法发文 08/10 10:32