Python - 在给定的大数范围内找到所有完美正方形的最快方法

时间:2013-04-13 06:11:04

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

我正在尝试编写一种方法来在Python中获取给定范围内的所有完美正方形。大范围,如2621163和520001400002.现在明显迭代范围并检查数字是否完美如此

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

然后打印它对于大范围是愚蠢的(适用于小范围)并且将永远。我想知道是否有任何Python魔法或mathemagic(比如改进的丢番图方程式),我可以为此目的利用它。

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

5 个答案:

答案 0 :(得分:9)

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

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))

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

li

答案 3 :(得分:0)

不使用函数的简单python代码

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

答案 4 :(得分:-1)

def perfect_squares(start, stop):
  return (i*i for i in xrange(math.ceil(math.sqrt(start)), math.floor(math.sqrt(stop)) + 1))