13828. 珅泽教育CSP-J第一轮模拟考第十八套 第 33 题

珅泽教育CSP-J第一轮模拟考第十八套 第 33 题

程序阅读(3):等差数列与二分查找

阅读程序,回答第 29—35 题。设 n 为正整数,计算过程中不发生整数溢出。

int solve(int x, int a, int d, int n)
{
    if (d < 0) {
        return solve(x, a + d * (n - 1), -d, n);
    }
    int begin = 0;
    int end = n;
    while (begin < end) {
        int mid = begin + (end - begin) / 2;
        if (a + d * mid < x) {
            begin = mid + 1;
        } else {
            end = mid;
        }
    }
    if (end == 0) {
        return a - x;
    } else if (end == n) {
        return x - (a + d * (n - 1));
    } else {
        int upper = a + d * end;
        int lower = upper - d;
        return std::min(x - lower, upper - x);
    }
}

当 end == 0 时,说明( )。

{{ select(1) }}

  • xx 比首项还小(或等于首项)
  • xx 比末项还大
  • xx 位于数列中某两项之间
  • 数列为空