【发布时间】:2016-03-27 03:10:45
【问题描述】:
所以我写了一个程序来找到一个数的平方的底。对于较小的数字,它似乎可以正常工作,但对于长数字,它会给出奇怪的结果。这是我的代码。
int SquareRoot(long x)
{
long start=1;
long end=x;
long mid;
while(start<end)
{
mid=start+(end-start+1)/2;
if(mid*mid<x)
{
if((mid+1)*(mid+1)>x)
{
return mid;
}
start=mid;
}
else if(mid*mid>x)
{
if((mid-1)*(mid-1<x)
return mid-1;
end=mid;
}
else
return mid;
}
return start;
}
【问题讨论】:
-
“它给出了奇怪的结果”不是一个有效的问题。您需要更具体、更简洁。
-
抱歉。我无法追踪更大数字上的预期输出和实际输出之间的关系,但这里有一些例子说明我在这些数字上得到的输出。
-
“无法追踪”?介意详细说明吗?
-
这里是一些大数字的输出: 输入:7777777 输出:393225 输入:990000 输出:173384 输入:1000000 输出:458753。
-
@s_123 因为平方根更接近 1 而不是 x / 2,所以如果我们从左边开始尝试会更好,这样就不会出现溢出问题。你可以在第一步尝试g = 1,测试
g * g和(g+1) * (g+1)。如果不是正确的候选人,请使用g = (g + x / g) / 2进行迭代。你可以看到有一个不变的g <= sqrt(x),确保你不会通过正确的候选人。