while循环示例

0 投票
8 回答
7501 浏览
提问于 2025-04-15 16:49
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,然后再试一次。

不过这个代码里有一些问题:

  1. else 语句的位置不对
  2. ‘打印 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'

撰写回答