2013-04-13 95 views
0

我想写一个方法到在Python中获取给定范围内的所有完美正方形。大范围的像2621163和520001400002.之间现在很明显,通过迭代范围和检查,如果一个号码是完美的,像这样Python - 在给定的大数范围内找到所有完美正方形的最快方法

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

,然后打印是愚蠢的大范围(小范围的伟大工程),并会采取永远。我想知道是否有任何可用于此目的的Python魔术或数学(例如修改的丢番图方程)。

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

回答

8

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

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
def perfect_squares(start, stop): 
    return (i*i for i in xrange(math.ceil(math.sqrt(start)), math.floor(math.sqrt(stop)) + 1)) 
1

想象数为34929456,可以来知道它是不是一个完美的正方形时,它的分裂为3:4:9:2:9:4:5:6 = 42。42 ISN '平方数,这意味着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,希望它有帮助!

相关问题