Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 整数乘法和除法之间意外的明显性能差异_C++_Algorithm_Optimization - Fatal编程技术网

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