while循环示例
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')
这是我在读的一本书中关于理解“while循环”的例子。我不太明白为什么要先进行地板除法,然后再用y % x?能不能有人解释一下这段代码在做什么?
谢谢!
8 个回答
1
逻辑是这样的:
如果 y 除以 x 的余数是 0,这就意味着 x 是 y 的一个因子,也就是说 y 有一个因数。这个时候就打印出来,然后跳出循环。
如果不是,就把 x 减 1,然后再试一次。
不过这个代码里有一些问题:
- else 语句的位置不对
- ‘打印 y 是质数’的语句在循环之后 - 这样它总是会打印出来。
4
这是一个很简单的质数测试。
% 是取模运算符。它的作用是进行除法运算,但返回的是余数,而不是除法的结果。举个例子,5 除以 2 的结果是 2(也就是 5 // 2 == 2),而余数是 1(也就是 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
这个程序会打印出一个整数y的至少一个因子,或者如果y没有其他因子(除了它自己和1),就会打印出y是质数。
它使用变量x来尝试所有大于1的可能因子。程序从y除以2的结果开始,因为没有任何数字会大于y的一半而成为因子。如果y是奇数,使用普通的除法可能会得到一个小数值。(更好的方法是从y的平方根开始,如果y不是质数,它的一个因子一定会小于或等于它的平方根。)
在循环内部,它会测试y % x,这个操作是计算y除以x的余数。如果余数为零,说明x是y的一个因子,然后就会打印出来。
如果在循环结束时没有找到因子,就会执行else部分,这样就可以判断y是质数了。如果找到了因子,程序会用“break”跳出循环和else部分。所以要么找到了因子,要么y就是质数。
下面是修正了缩进的改进代码:
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'