スナップ69.xの平方根C++二分解法
int sqrt(int x)関数を実現します.
xの平方根を計算して返します.ここで、xは非負の整数です.
戻りタイプが整数であるため、結果として整数の部分のみが保持され、小数の部分は切り捨てられます.
例1:
入力:4出力:2例2:
例2:
入力:8出力:2説明:8の平方根は2.82842...で、戻りタイプが整数であるため、小数部は切り捨てられます.
主な思想はすべての整数を遍歴することであり,整数秩序のために二分法を考え,他の方法にはポケットコンピューティングアルゴリズム,ニュートン反復などの非主流の方法が含まれている.
xの平方根を計算して返します.ここで、xは非負の整数です.
戻りタイプが整数であるため、結果として整数の部分のみが保持され、小数の部分は切り捨てられます.
例1:
入力:4出力:2例2:
例2:
入力:8出力:2説明:8の平方根は2.82842...で、戻りタイプが整数であるため、小数部は切り捨てられます.
int mySqrt(int x) {
if (x == 1||x==0) return x;
int low = 1, high = x - 1;
int m=0;
while (low <= high) {
int mid = (low + high) / 2;
/*
if (mid > 46341) {// ,
high = 46341;// int , 46340
continue;
}
*/
long long chen = (long long)mid * (long long )mid;
if (chen == x) {
//mid*mid ? long long
m = mid;//
break;
}
else if (chen > x) high = mid-1;
else low = mid+1;
}
if (m != 0) return m;
long long x1 = (long long)low * (long long)low, x2 = (long long)high * (long long)high;
if (x1 < x && x2 < x) return (low > high) ? low : high;
else return(x1 < x) ? low : high;
//
}
主な思想はすべての整数を遍歴することであり,整数秩序のために二分法を考え,他の方法にはポケットコンピューティングアルゴリズム,ニュートン反復などの非主流の方法が含まれている.