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

Posted

技术标签:

【中文标题】Python - 在给定的大数范围内找到所有完美正方形的最快方法【英文标题】:Python - Fastest way to find all perfect squares in a given large number range 【发布时间】:2013-04-05 18:38:58 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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))

【讨论】:

以上是关于Python - 在给定的大数范围内找到所有完美正方形的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

在查找c ++范围内的完美正方形时由于超时错误而终止

在python中生成给定范围内的所有日期

如何制作在给定范围内打印质数的程序

谷歌面试:在给定的整数数组中找到所有连续的子序列,其总和在给定范围内。我们能比 O(n^2) 做得更好吗?

找到给定范围内数字的最大最小差

【python滴滴出行】整数无序数组求第K大数?