修改Python代码以找出3到31范围内与20互质(coprime)的数
修改Python代码以找出3到31范围内与20互质(coprime)的数
嘿,我来帮你调整这段代码~ 你原来的逻辑是在找和20有共同因数(大于1)的数,现在要反过来找互质的数,核心就是判断:有没有任何大于1的数能同时整除i和20?如果没有,那i就是和20互质的。
先给你基于原有代码修改的版本,这样你能直观看到逻辑的变化:
# 找出3到31范围内与20互质的数 k = 0 z = 20 for i in range(3, 31): for j in range(2, 30): if ((i % j == 0) & (z % j == 0)): k = k + 1 if k == 1: # 只要找到一个共同因数,就说明i和20不互质,直接跳出内层循环 break # 内层循环跑完后,如果k还是0,说明没找到任何共同因数,i就是互质数 if k == 0: print(i) k = 0
我修改了这几个地方:
- 反转判断逻辑:原来找到共同因数就打印(不互质的数),现在改成:内层循环结束后如果
k还是0,说明没找到任何共同因数,才打印这个互质的数 - 加了break优化:一旦找到第一个共同因数,就不用继续内层循环了,直接跳出,节省没必要的计算
- 调整打印位置:把打印逻辑移到内层循环外面,根据最终的
k值来决定是否输出
另外,给你推荐一个更简洁高效的写法,适合你后续学习:Python的math模块里自带gcd函数(计算最大公约数),只要两个数的最大公约数是1,它们就是互质的。用这个方法代码会简洁很多:
import math # 找出3到31范围内与20互质的数 z = 20 for i in range(3, 31): if math.gcd(i, z) == 1: print(i)
不管用上面哪一种方法,运行后都会得到你想要的输出:
3 7 9 11 13 17 19 21 23 27 29
顺便解释下你之前的思路问题:
你想写的(((i%j)!==0) & ((z%j)!==0))这个条件,只是判断当前这个j不能同时整除i和20,但这只是单个j的情况。我们需要的是所有大于1的j都不能同时整除i和20,而不是某一个j满足这个条件,所以不能直接用这个条件来判断互质哦。
备注:内容来源于stack exchange,提问作者kzs
相关产品推荐
相关产品推荐

