✏️ 纠错
第 188 题 / 共 251 题
第12题 有关下面C++代码的说法,错误的是( )。
double sqrt_binary(long long n, double epsilon = 1e-10) {
    if (n < 0) {
        throw invalid_argument("输入必须为非负整数");
    }

    if (n == 0 || n == 1) return n;

    // 阶段 1
    long long low = 1, high = n;
    long long k = 0;

    while (low <= high) {
        long long mid = (low + high) / 2;
        long long mid_sq = mid * mid;

        if (mid_sq == n) {
            return mid;
        } else if (mid_sq < n) {
            k = mid;
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    long long next_k = k + 1;
    if (next_k * next_k == n) {
        return next_k;
    }

    // 阶段 2
    double low_d = (double)k;
    double high_d = (double)(k + 1);
    double mid;

    while (high_d - low_d > epsilon) {
        mid = (low_d + high_d) / 2;
        double mid_sq = mid * mid;

        if (mid_sq < n) {
            low_d = mid;
        } else {
            high_d = mid;
        }
    }

    double result = (low_d + high_d) / 2;
    long long check_int = (long long)(result + 0.5);
    if (check_int * check_int == n) {
        return check_int;
    }

    return result;
}
📝 题目解析

答案:D

知识点:二分法求平方根的算法,浮点数比较和精度处理

解析:A正确,阶段1通过整数二分查找完全平方数;B正确,阶段2在整数区间内用浮点二分求近似值;C正确,+0.5是四舍五入,用于处理浮点误差;D错误,浮点数比较high_d - low_d >= epsilon是可行的(当精度满足时退出),不会死循环。