This question already has answers here:
How is the square root function implemented?
(12个答案)
2年前关闭。
我正在解决奥林匹克竞赛中的一些任务,但我陷入了一个问题。我找到了该任务的解决方案,但是我的解决方案需要平方根。我的代码对于前12个输入正常工作,但随后给出了错误的答案。我猜这是由于输入量极大,可能高达10 ^ 400000。所以我想知道是否有办法计算C中这些极大输入的平方根的整数部分。这是代码:
被建立,并在保持不变的情况下反复将
最后,您将缩小到
因此
评估条件
要么
只需跟踪
(12个答案)
2年前关闭。
我正在解决奥林匹克竞赛中的一些任务,但我陷入了一个问题。我找到了该任务的解决方案,但是我的解决方案需要平方根。我的代码对于前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;
}
最佳答案
简而言之,您可以使用二分法滚动长平方根算法,如下所示:
选择一个长数字表示形式(无符号整数数组);
进行长的加减运算(除进位以外,相当琐碎);
实施减半(也需要对进位进行一些照顾);
实现长时间比较(类似于减法)。
[请注意,加法使您可以实现加倍和四倍,而减半还可以除以四。
然后设置d= 1
,并反复将d
翻倍直到d² > N
。 (每次将d
翻倍,就会将d²
翻四倍。)
接下来,设置a= 0
以便不变量
a² ≤ N < (a + d)²
被建立,并在保持不变的情况下反复将
d
减半。这是通过实现d= d/2;
如果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
和d²
术语,并在修改d
或a
时对其进行更新即可。这仅需要上述原始操作。关于c - 计算C中极大数的平方根,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48176305/
10-10 16:10