【问题标题】:Efficiently computing all the perfect square numbers for very large numbers like 10**20有效地计算非常大的数字(如 10**20)的所有完美平方数
【发布时间】:2020-07-23 14:48:14
【问题描述】:

完美平方数的例子是1,4,9,16,25....

我们如何计算非常大的数字(例如 10 pow 20)的所有完美平方数。对于 10 pow 20,有 10 个 pow 10 完美平方数。

到目前为止我做了什么......

Bruteforce:计算 x**2 在 1 到 10 pow 10 的范围内。因为我的系统只接受 10 pow 6。这不起作用。

两个指针的方法:我已经取了上限和下限....

上限为 10 pow 20

下限为 1

现在,我采用了两个指针,一个在开头,另一个在结尾。那么下界的下一个完美正方形将是

下界 + (sqrt(下界) *2+1)

示例:对于 4 的下一个完美正方形是

4 + (sqrt(4)*2+1)= 9

以同样的方式上限将减少

上限 - (sqrt(上限) *2-1)

示例:对于 25,之前的完美正方形是

25 - (sqrt(25)*2-1) =16

上述两种方法都不能很好地工作,因为上限是非常非常大的数字 10 pow 20。

我们如何在更短的时间内有效地计算所有完美的平方直到 10 pow 20?

【问题讨论】:

    标签: algorithm numbers sequence square perfect-square


    【解决方案1】:

    很容易注意到完美正方形之间的区别:

    0   1   4   9   16   25   ...
    |___|___|___|___|_____|
      |   |   |   |    |
      1   3   5   7    9
    

    所以我们有:

    answer = 0;
    for(i = 1; answer <= 10^20; i = i + 2)
        answer = answer + i;
        print(answer);
    }
    

    由于您想要直到 x 之前的所有完美平方,时间复杂度将为 O(sqrt(x)),对于 x = 10^20,其平方为 10^10,这可能会很慢。

    【讨论】:

    • 如果我们需要在某个范围内计算所有这些数字怎么办。假设在 a 和 b 范围内 a = 10 pow 5 和 b = 10 pow 20 ..我们需要计算所有完美平方,那么我们应该如何实现这个
    • 找到第一个大于或等于 a 的完美正方形。然后找到第二个。取它们之间的差异并做同样的事情。
    猜你喜欢
    • 2014-09-23
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2014-07-14
    相关资源
    最近更新 更多