所以我写了一个程序,找到一个数字的平方。对于较小的数字似乎工作正常,但对于长数字,它会产生奇怪的结果。这是我的代码。
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;
}
答案 0 :(得分:3)
可能是&#34;奇怪的结果&#34;当一个或两个计算mid * mid
和(mid + 1) * (mid + 1)
溢出时会发生这种情况,这会在end
大于2*sqrt(LONG_MAX)
时发生(如果long
是大约6,074,000,998,则会发生这种情况如果long
是32位,则为64位或92680。
溢出将导致与x
的比较产生错误的结果(从技术上讲,溢出会产生未定义的行为,尽管gcc的结果是可预测但不正确的。)