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

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

程序阅读(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);
    }
}

该函数的功能是( )。

{{ select(1) }}

  • 求 xx 在等差数列中的下标
  • 判断 xx 是否为等差数列中的一项
  • 求 xx 与等差数列某一项的最小距离
  • 求 xx 与等差数列首项的差