共63道题,当前是第56

Description

1   #include <iostream>
2   using namespace std;
3   int a[] = {1,3,5,7,9,13,18,22,37,45,51,62,77,89,93}, x;
4   int main() {
5       cin >> x;
6       int left = 0, right = 15, mid, p = -1, count = 0;
7       while (left < right) {
8           mid = (left + right - 1) / 2;
9           count++;
10          if (a[mid] == x) {
11              p = mid;
12              break;
13          }
14          else if (a[mid] < x)
15              left = mid + 1;
16          else
17              right = mid;
18      }
19      cout << p << endl;
20      cout << count << endl;
21      return 0;
22  }

本程序使用二分查找算法寻找 $x$ 在数组 $a$ 中对应的下标 $p$(若 $x$ 在数组中不存在则 $p=-1$),同时使用 $count$ 记录二分查找的次数。

1. 错误。解析:变量 $x$ 并不对应数组下标,所以 $x$ 的值并不会造成数组越界。
2. 正确。解析:因为 $p$ 对应数组 $a$ 的下标,所以若找到 $a[p]==x$,则 $p$ 的值介于 $0 \sim 14$ 范围内,若没有找到,则 $p=-1$,所以 $p$ 的值不会超过 $14$。
3. 正确。解析:变量 $count$ 的值对应二分查找的次数,对于长度为 $15$ 的数组 $a$,二分查找的次数不会超过 $⌈log_215⌉=4$。
4. C。解析:$a[2]==5$。
5. A。解析:$a$ 数组中不存在任何一个元素等于 $12$,所以输出的第一行为 $-1$。
6. D。解析:一共二分查找了 $4$ 次,对应的 $mid$ 及 $a[mid]$ 分别为 $a[7]=22,a[11]=62,a[9]=45,a[8]=37$。 

Question

输入的 $x$ 不能大于 $15$,否则会发生数组越界。( )

输出的第一行不会大于 $14$。( )

输出的第二行不会大于 $4$。( )

当输入为 $5$ 时,输出的第一行为( )。

当输入为 $12$ 时,输出的第一行为( )。

当输入为 $37$ 时,输出的第二行为( )。