我正在从学校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;
}
答案 0 :(得分:0)
简而言之,您可以通过以下两种方法滚动长方形算法:
选择一个长数字表示(无符号整数数组);
实施长加法和减法(非常简单,除了携带);
实施减半(也需要一些照顾);
实现长比较(类似于减法)。
[注意,添加允许您实现加倍和四倍,并且减半也会产生除以4。]
然后设置d= 1
并重复加倍d
直到d² > N
。 (每当你加倍d
时,你就会翻两倍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
和d²
这两个术语,并在修改d
或a
时更新它们。这只需要进行上述原始操作。