高效计算非常大的数字(如 10**20)的所有完全平方数
Efficiently computing all the perfect square numbers for very large numbers like 10**20
完全平方数的例子是1,4,9,16,25....
我们如何计算非常大的数字(如 10 pow 20)的所有完全平方数。对于 10 pow 20,有 10 pow 10 完全平方数。
到目前为止我做了什么....
Bruteforce:计算 1 到 10 pow 10 范围内的 x**2。因为我的系统只接受 10 pow 6。这没有用。
双指针方法:我已经采用了上限和下限....
上限是 10 pow 20
下限为 1
现在,我有两个指针,一个在开头,一个在结尾。那么下界的下一个完美平方将是
下限 + (sqrt(下限) *2+1)
示例:对于 4,下一个完全正方形是
4 + (平方(4)*2+1)= 9
以同样的方式上限将减少
上限 - (sqrt(上限) *2-1)
示例:对于 25,上一个完全平方是
25 - (sqrt(25)*2-1) =16
上述两种方法都效果不佳,因为上限非常大,10 pow 20。
我们如何才能在更短的时间内有效地计算出 10 pow 20 之前的所有完美平方?
很容易注意到完美正方形之间的区别:
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,这可能会很慢。
完全平方数的例子是1,4,9,16,25....
我们如何计算非常大的数字(如 10 pow 20)的所有完全平方数。对于 10 pow 20,有 10 pow 10 完全平方数。
到目前为止我做了什么....
Bruteforce:计算 1 到 10 pow 10 范围内的 x**2。因为我的系统只接受 10 pow 6。这没有用。
双指针方法:我已经采用了上限和下限....
上限是 10 pow 20
下限为 1
现在,我有两个指针,一个在开头,一个在结尾。那么下界的下一个完美平方将是
下限 + (sqrt(下限) *2+1)
示例:对于 4,下一个完全正方形是
4 + (平方(4)*2+1)= 9
以同样的方式上限将减少
上限 - (sqrt(上限) *2-1)
示例:对于 25,上一个完全平方是
25 - (sqrt(25)*2-1) =16
上述两种方法都效果不佳,因为上限非常大,10 pow 20。
我们如何才能在更短的时间内有效地计算出 10 pow 20 之前的所有完美平方?
很容易注意到完美正方形之间的区别:
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,这可能会很慢。