C++ 整数乘法和除法之间意外的明显性能差异
我正在实现一个简单的二进制搜索来查找整数的平方根。代码运行正常。但是,如果我将C++ 整数乘法和除法之间意外的明显性能差异,c++,algorithm,optimization,C++,Algorithm,Optimization,我正在实现一个简单的二进制搜索来查找整数的平方根。代码运行正常。但是,如果我将if中的条件从mid*mid>x更改为mid>(x/mid),则大输入似乎会超时,那么一切都很好 int sqrt(int x) { if(x < 0) return -1; if(x <= 1) return x; int l,r,mid,ans; l = 0; r = x; while(l <=r ){ mid = (l + r) /
if
中的条件从mid*mid>x
更改为mid>(x/mid)
,则大输入似乎会超时,那么一切都很好
int sqrt(int x) {
if(x < 0) return -1;
if(x <= 1) return x;
int l,r,mid,ans;
l = 0;
r = x;
while(l <=r ){
mid = (l + r) / 2;
if((mid * mid) == x) return mid;
if((mid * mid) > x ){ //<===== here if I change to mid > (x / mid)
r = mid - 1;
}else{
l = mid + 1;
ans = mid;
}
}
return ans;
}
intsqrt(intx){
如果(x<0)返回-1;
if(x)
比
(mid * mid) > x
因为您可以避免整数溢出。大输入的问题是,mid*mid>x
可能会溢出整数,然后二进制文件可能会进入一个非常奇怪的状态。在这种情况下,您可能会得到正确的值,但这有点纯粹是运气。另一方面,使用除法可以避免整数溢出。可能的重复当然,我不同意这个重复,因为它更多的是关于浮点运算,而这个案例是整数运算。我也编辑了标题来反映这一点。如果你不同意,请回滚。你在不到一分钟的时间里投票失败了,你真的读过我的问题吗?@Bathsheba:是的,我同意,我担心没有人会回答我的问题反对票的原因,谢谢。我最后编辑了它。两个答案(在我写作时)都是正确的。非常感谢,我太傻了,没想到,错误一直说“超过时限”,我只是一直在考虑速度。非常感谢你的回答,我只能接受一个答案。因为你有更多的声誉,我会接受另一个家伙:)
(mid * mid) > x