计算C中极大数的平方根

时间:2018-01-09 20:37:38

标签: c algorithm math limits

我正在从学校olimpiads解决一些任务,我被困在一个问题上。我找到了该任务的解决方案,但我的解决方案需要平方根。我的代码适用于前12个输入,但它给出了错误的答案。我想这是由于极大的输入,可以大到10 ^ 400000。所以我想知道是否有办法在C中计算这些极大输入的平方根的整数部分。这是代码:

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
    long long n;
    scanf("%lld", &n);
    long long ans;
    ans = sqrtl(n-1);
    long long result;
    result = ans+1-llabs(n-ans*ans-(ans+1));
    printf("%lld\n", result);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

简而言之,您可以通过以下两种方法滚动长方形算法:

  • 选择一个长数字表示(无符号整数数组);

  • 实施长加法和减法(非常简单,除了携带);

  • 实施减半(也需要一些照顾);

  • 实现长比较(类似于减法)。

[注意,添加允许您实现加倍和四倍,并且减半也会产生除以4。]

然后设置d= 1并重复加倍d直到d² > N。 (每当你加倍d时,你就会翻两倍。)

接下来,设置a= 0以使其不变

a² ≤ N < (a + d)²

已建立,并在保持不变量的同时反复将d减半。这是通过

实现的

d= d/2; if N < (a + d)²,设置a= a + d;否则保持a不变。

最后,您将缩小到

a² ≤ N < (a + 1)²

以便a是整数平方根。

评估条件

N < (a + d)² = a² + 2ad + d²,

N - a² < 2ad + d²,

只需跟踪N - a²2ad这两个术语,并在修改da时更新它们。这只需要进行上述原始操作。