x = y // 2 # For some y > 1
while x > 1:
if y % x == 0: # Remainder
print(y, 'has factor', x)
break # Skip else
x -= 1
else: # Normal exit
print(y, 'is prime')
这是一个理解我正在阅读的书中循环的一个例子,我不太明白为什么一个分区然后y%x?有人可以解释这段代码吗,它在做什么?
谢谢!
答案 0 :(得分:4)
这是一个跛脚primality test。
%是mod operator。它执行除法并返回余数而不是除法的结果。例如,5 // 2 == 2,和5%2 == 1。
评论:
x = y // 2 # For some y > 1 ##Reduce search space to half of y
while x > 1:
if y % x == 0: # Remainder ##If x divides y cleanly (4 / 2 == 2)
print(y, 'has factor', x) ##y is not prime
break # Skip else ##Exit the loop
x -= 1 # Normal exit ##Try the next value
else:
print(y, 'is prime')
答案 1 :(得分:1)
逻辑是:
如果y modulo x为0,则表示x是y的dividor,因此y有一个因子。打印出来,并打破循环。
如果没有,请将x减1,然后重试。
但是这段代码中有些东西被破坏了:
答案 2 :(得分:1)
程序打印至少一个整数y的因子,或者如果它没有因子(除了它本身和1),打印y是素数。
它使用变量x来尝试大于1的所有可能因子。它从y的下限开始除以2,因为没有大于y的一半的数字可能是一个因素。如果y是奇数,使用正常除法而不是地板除法可以给出小数值。 (更好的解决方案是从y的平方根开始 - 如果y不是素数,其中一个因子将小于或等于其平方根。)
在循环内部,它测试y%x,这是将y除以x后的余数。如果余数为零,则表示x是y的因子,并打印出来。
else子句在循环结束时执行,除非找到一个因子,在这种情况下,“break”跳过循环和else子句。所以要么找到一个因子,要么就是它的主要因素。
以下是修改了缩进的改进代码:
import math
def check_primality(y):
x = int(math.sqrt(y))
while x > 1:
if y % x == 0:
print y, 'has factor', x
break
x -= 1
else:
print y, 'is prime'
答案 3 :(得分:1)
代码只检查是否已达到x的平方根。请注意,您可以通过检查从2到x的平方根的整数是否完美地划分x(没有余数)来检查数字的素数。
答案 4 :(得分:1)
对于任何非素数的数字(x),将存在大于1且小于(x / 2)的因子。 9 = 3 * 3 逻辑是迭代所有数字< = x / 2并检查数字是否分开。
答案 5 :(得分:0)
我认为该计划试图找到y的最大素因子。 如果y是一个主要因素,它也会打印出来。
答案 6 :(得分:0)
x = y // 2
用于测试x:2..y/2
范围内的数字
更好的方法是仅测试数字x:2..sqrt(y)
答案 7 :(得分:0)
%表示一个模数,它给你剩余的除法......
并且此代码检查素数Y并检查Y是否是x的乘数...
x = y // 2#x = y的除法或模数,2
而x> 1:#你想检查这是一个除法结果还是一个模数
如果y%x == 0:#,如果y是x的乘数
print(y, 'has factor', x)
break # break the while loop
x -= 1 # decreament x
else:#如果wihle达到x>则执行此行1并没有打破 print(y,'是prime')
所以如果y是x的乘数,它将递减x并且循环继续 否则它将打印y是素数