【问题标题】:Fastest way to find a number in an unknown range?在未知范围内找到数字的最快方法?
【发布时间】:2021-06-20 04:38:34
【问题描述】:

很抱歉这个可怕的标题 - 我是 python 新手,我不知道如何描述我的问题。所以问题是:

x 加 100 是一个完全平方数,再加上另一个 168 也是一个完全平方数。找到 x。

这是我的答案:

from math import sqrt
for x in range(-100,10000):
    a=int(sqrt(x+100))
    b=int(sqrt(x+100+168))
    if (a*a!=x+100) or (b*b!=x+100+168):
        continue
    else:
        print(x)

问题是,我实际上不知道范围。我只知道这个数字不能小于-100,但10000只是我放在那里的一个随机大数。有没有办法让我先找出一个更小的范围?或者我可以加快速度的方法?

【问题讨论】:

  • 范围的上限绝对不会影响找到第一个解决方案所需的时间。为了加快这个过程,考虑迭代平方数,而不是所有数字——它们的数量要少得多!将每个平方数 S 添加到集合中,查看 S-168 是否已经在集合中。如果是这样,请将S-268 显示为解决方案。
  • 为什么要检查从 1 开始到可能无穷大的每个数字?把问题放在头上:遍历每个大于 100 的完美正方形,加上 168,看看这个数字是否是完美正方形。

标签: python python-3.x


【解决方案1】:

如果您想要范围内的所有解决方案,这是一个更快的解决方案

for x in range(-100,10000):
    if ((x+100)**.5).is_integer():       
        if ((x+268)**.5).is_integer():
            print(x)

如果只需要第一种解决方案,可以在print语句后添加break

【讨论】:

    【解决方案2】:

    您的问题有一个很容易确定的上限:在几个数字之后,完全平方之间的差远大于 168。(看看 100^2 和 101^2。结果是大约相隔 200 人。这样你的人数将不会超过 10,000)。

    如果您想加快解决问题的速度,而不是检查数字是否为平方,您可以检查通过平方数字是否可以解决问题。

    for x in range(0,100):
        y=x
        while y**2 - x**2 < 169 and y < 100:
            y+=1
            if y**2 - x**2 == 168:
                print("Your number is: " + str(x**2 - 100))
        
    

    编辑:代码已损坏,已修复。运行它会得到 -99(-99 + 100 是 1,是一个完美的正方形,1 + 168 是 169,即 13^2)、21、261 和 1581

    【讨论】:

    • 我不明白为什么y**2 - x**2 == 168 有效。你能详细说明一下吗?条件不应该是 (x+100) 和 (x+268) 都是完美的正方形吗?
    • 不是从 -100 到 10,000 并检查哪些数字是平方根,而是从 0 开始到 100 并对每个数字进行平方,确保结果是一个完美的平方。平方不仅比平方根快,而且数字范围也小得多。因此,x 和 y 本身并不是完全平方,而是完全平方的平方根,需要平方才能得到实际数字,这也是打印出来的原因,它打印 x^2 并减去 100,因为该数字表示解 + 100 是正方形。
    【解决方案3】:

    由于提示仅假定x 的一个正确值,因此无需使用for 循环,因为我们可以使用while 无限循环并且不知道上限。

    要检查运算结果是否为整数,我们可以检查数字的浮点数和整数表示是否相等,即int(num) == num

    >>> i = 1
    >>> while True:
            a, b = (i+100)**0.5, (i+268)**0.5
            if int(a) == a and int(b) == b:
                break
            i += 1
    
            
    >>> i
    21
    

    如果我们检查所获得结果的质量,两个结果都是整数:

    >>> (i+100)**0.5
    11.0
    >>> (i+268)**0.5
    17.0
    

    【讨论】:

    • 其实第二个条件应该是(i+268)**0.5,问题中提到:“再加168”。
    • @OmarAlSuwaidi 感谢您指出这一点。
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多