[问题] 质数_巢状循环_菲丝恩

楼主: nknuukyo (我无所能因敌成体)   2017-08-09 14:28:15
各位前辈好,
最近在看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在哪里,还请前辈们慧眼点明~
楼主: nknuukyo (我无所能因敌成体)   2017-08-09 14:29:00
使用版本为3.6.1
作者: tsoahans (ㄎㄎ)   2017-08-09 15:32:00
int(i/j)+1改int(i/j)+2
作者: CaptainH (Cannon)   2017-08-09 16:58:00
i/j 这是错的
作者: stucode   2017-08-09 19:06:00
这问题网站上就有勘误资讯 不过我也不懂i/j那边的逻辑
作者: bruce0209 (士贤)   2017-08-09 20:35:00
for j 的前一行加上print("i:"+str(i)+" j:2~"+str(int(i/j)+1))if j>i**0.5的前一行加上print(str(j)+" > "+str(i**0.5)+" ? ")应该就不会找不到BUG了吧...话说我也不懂i/j的原因 求解
作者: mikapauli (桜花)   2017-08-09 20:51:00
最小就近似根号i,随便给个上限而已吧。想法很奇怪就是
作者: uranusjr (←這人是超級笨蛋)   2017-08-09 23:06:00
我问一句这是完全照书上打的吗, 如果是的话感觉不算好书看了勘误感觉应该是照书上没错, 这种烂 code 也出书...i/j 写成 int(i**0.5) 应该就看得懂了吧, 这两个等价把的最后一个 iteration j = (i/j-1)+1 移项应该就懂了
作者: bruce0209 (士贤)   2017-08-09 23:25:00
懂原义了不过还是很诡异...j^2=(i**0.5)^2然后移项的意思吧....可是 j1 = (i/j2-1)+1 在运作上j1和j2不相等吧...
作者: TitanEric (泰坦)   2017-08-10 00:19:00
我觉得程式逻辑很奇怪…
作者: uranusjr (←這人是超級笨蛋)   2017-08-10 00:49:00
是啊, 因为 range 的参数是在初始化时就决定, 所以里面的 j 会是“前一个 i iteration”的 j 的最后一个值会觉得诡异奇怪是正常的, 因为写出这样的东西要嘛根本写错要嘛脑袋打结异于常人, 无论是哪种在一般公司都会被电到翻, 别说写书出来卖钱了...
作者: bibo9901 (function(){})()   2017-08-10 08:31:00
因为i是偶数时, j只会跑到2. 所以下一个i(奇数)时, 就会使j介于2~i/2, 这个上限大于sqrt(i), 所以大部份是对的
作者: APM99 (血统纯正台北人)   2017-08-10 08:50:00
这篇写法是很标准的求质数方法阿 不诡异吧改成这样即可 : http://imgur.com/Z2axM0O非常标准的作法 ~~只是2会被忽略掉 没啥差#忘了说 这篇一开始的写法5没印出来是被误差害死的...尽量避免掉会有误差的写法
作者: stucode   2017-08-10 10:15:00
看了众位板友解说豁然开朗 原来是i/j是从j>sqrt(i)来的
作者: APM99 (血统纯正台北人)   2017-08-10 10:17:00
我中午在发篇文解释一下 这篇方法是高中学的A*B=P求质数法
楼主: nknuukyo (我无所能因敌成体)   2017-08-10 10:18:00
感谢APM99大~ !!
作者: stucode   2017-08-10 10:19:00
不过原书code真的写得很不好 勘误版本虽然结果正确建议原PO看过就好
作者: APM99 (血统纯正台北人)   2017-08-10 10:31:00
我的写法是错的! 我没避免掉误差可惜我现在没法发文

Links booklink

Contact Us: admin [ a t ] ucptt.com