【问题标题】:Python - Fastest way to find all perfect squares in a given large number rangePython - 在给定的大数范围内找到所有完美正方形的最快方法
【发布时间】:2026-02-05 05:50:01
【问题描述】:

我正在尝试编写一种方法来在 Python 中获取给定范围内的所有完美正方形。一个很大的范围,比如 2621163 和 520001400002 之间。现在显然遍历范围并检查一个数字是否像这样完美

def is_square(n):
    return math.sqrt(n).is_integer()

然后打印它对于大范围来说是愚蠢的(对于小范围来说效果很好)并且需要永远。我想知道是否有任何 Python 魔法或数学魔法(比如修改后的丢番图方程)可以用于此目的。

编辑:我也在使用 Python 3.X,所以我可以使用大整数。

【问题讨论】:

    标签: python-3.x square-root perfect-square


    【解决方案1】:

    你意识到如果你知道第一个和最后一个最接近的完美正方形,剩下的就是它们之间的范围。我会这样计算:

    import math
    
    def all_squares(a,b):#a is the starting point whereas b is the end of range
        smallest = int(math.ceil(math.sqrt(a)))#perfect square closest to lower bound (rounded up)
        largest = int(math.sqrt(b))#perfect square closest to upper bound (rounded down)
        squares = []
        for s in range(smallest, largest+1):
            squares.append(s**2)
        return squares
    
    

    【讨论】:

      【解决方案2】:

      没有使用函数的简单python代码

      import math
      num=500
      for i in range(1,math.ceil(math.sqrt(num))):
          print(i*i)
      

      【讨论】:

        【解决方案3】:

        使用 numpy 获得 1 到 100 位的完美平方

        import numpy as np
        
        a={int(np.sqrt(x)) for x in range(1,101)}
        
        b= np.power(list(a),2) 
        
        print(a)
        
        print(b)
        

        【讨论】:

          【解决方案4】:

          您可以简单地找到在指定范围内具有正方形的最小和最大数字。然后您可以返回该范围内每个数字的平方。

          import math
          
          def perfect_squares(min, max):
              lowest = int(math.ceil(math.sqrt(min)))
              highest = int(math.sqrt(max))
              return (n**2 for n in range(lowest, highest + 1))
          

          【讨论】:

            【解决方案5】:

            想象一下这个数字是 34929456,你可以知道它不是一个完美的正方形,因为它被拆分 3:4:9:2:9:4:5:6= 42. 42 不是一个正方形数字,所以这意味着 34929456 不是一个完美的正方形! (我没有使用计算器)现在我们知道它不是一个完美的正方形,你会把它向上/向下四舍五入...... 所以,你取最后 2 位数字,56!用个位数计算 56 是 7(Times)8=56! 34929456 是一个 8 位数字,因此意味着 8-7=1+4=5。所以这意味着答案在 5000 到 6000 之间。现在,你做一点猜测。让我们做 5500 平方 = 30250000。所以我们知道平方根有点大!现在让我们试试 5910。5910 的平方 = 34928100。所以知道我们知道答案在 5910 和 5911 之间!谢谢阅读! :P,希望对您有所帮助!

            【讨论】:

            • 完全平方 (PS) 数的位数之和不必是完全平方,例如64, 256.
            【解决方案6】:
            def perfect_squares(start, stop):
              return (i*i for i in xrange(math.ceil(math.sqrt(start)), math.floor(math.sqrt(stop)) + 1))
            

            【讨论】: