Skip to main content
 首页 » 编程设计

python之如何有效地枚举所有完美的正方形

2025年05月04日11qlqwjy

我制作了以下程序,它要求用户输入上限并计算并打印每个完美的正方形直到上限。但是,我认为我的 is_perfect_square 函数不是很有效,因为当上限为数千或更多时计算完美平方需要很长时间。我想知道如何让我的程序更有效率,我认为使用数学模块来使用 sqrt 可以工作,但我不是数学家所以请求帮助。 我的程序是:

"""Print all the perfect squares from zero up to a given maximum.""" 
import math 
 
def read_bound(): 
   """Reads the upper bound from the standard input (keyboard). 
      If the user enters something that is not a positive integer 
      the function issues an error message and retries 
      repeatedly""" 
   upper_bound = None 
   while upper_bound is None: 
       line = input("Enter the upper bound: ") 
       if line.isnumeric() and int(line) >= 0: 
           upper_bound = int(line) 
           return upper_bound 
       else: 
           print("You must enter a positive number.") 
 
 
 
def is_perfect_square(num): 
   """Return true if and only if num is a perfect square""" 
   for candidate in range(1, num): 
       if candidate * candidate == num: 
           return True 
 
 
 
def print_squares(upper_bound, squares): 
   """Print a given list of all the squares up to a given upper bound""" 
 
 
   print("The perfect squares up to {} are: ". format(upper_bound)) 
   for square in squares: 
       print(square, end=' ') 
 
 
 
def main(): 
   """Calling the functions""" 
   upper_bound = read_bound() 
   squares = [] 
   for num in range(2, upper_bound + 1): 
       if is_perfect_square(num): 
           squares.append(num) 
 
   print_squares(upper_bound, squares) 
 
 
main() 

请您参考如下方法:

我会完全颠倒逻辑,首先取上界的平方根,然后打印小于或等于该数的每个正整数的平方:

upper_bound = int(input('Enter the upper bound: ')) 
 
upper_square_root = int(upper_bound**(1/2)) 
 
print([i**2 for i in range (1, upper_square_root+1)]) 

绑定(bind) 78 的示例输出:

[1, 4, 9, 16, 25, 36, 49, 64]

这样你就可以避免很多不必要的循环和数学计算。