以下问题已在 GATE CS 2006 考试中提出。
1. 考虑以下 C 程序片段,其中 i、j 和 n 是整数变量。
for (i = n, j = 0; i >0; i /= 2, j += i);
让 val(j) 表示在 for 循环终止后存储在变量 j 中的值。以下哪一项是正确的?
(A) val(j) = Θ(logn)
(B) vaI(j) = Θ(sqrt(n))
(C) val(j) = Θ(n)
(D) val(j) = Θ(nlogn)
答案 (C)
请注意 for 循环后面的分号,因此正文中没有任何内容。变量 j 最初为 0,j 的值是 i 的值之和。 i 初始化为 n 并在每次迭代中减半。
j = n/2 + n/4 + n/8 + .. + 1 = Θ(n)
2. 考虑以下 C 函数,其中 a[n] 和 b[m] 是两个已排序的整数数组,而 c[n + m] 是另一个整数数组。
void xyz(int a[], int b [], int c[])
{
int i, j, k;
i = j = k = O;
while ((i
在 while 循环终止后,下列哪个条件成立?
(i) j < m, k = n+j-1, and a[n-1] < b[j] 如果 i = n (ii) i < n, k = m+i-1, and b[m -1] <= a[i] 如果 j = m
(A) 仅 (i)
(B) 仅 (ii)
(C) (i) 或 (ii) 但不是两者
(D) 既不是 (i) 也不是 (ii)
答案 (C)
如果 c[] 中最后插入的元素来自 a[],则条件 (i) 为真,如果最后插入的元素来自 b[],则条件 (ii) 为真。
3. 考虑这个 C 代码来交换两个整数和这五个语句:代码
void swap(int *px, int *py)
{
*px = *px - *py;
*py = *px + *py;
*px = *py - *px;
}
S1:会产生编译错误
S2:可能会在运行时根据传递的参数生成分段错误
S3:正确实现所有输入指针的交换过程,这些指针指向存储在进程可访问的内存位置中的整数
S4:为一些但不是所有的有效输入指针正确实现交换过程
S5:可以加减整数和指针。
(一) S1
(B) S2 和 S3
(C) S2 和 S4
(D) S2 和 S5
答案 (C)
S2:如果指针 px 或 py 处的值是常量或 px 或 py 指向无效的内存位置,则可能会生成分段错误
S4:可能不适用于所有输入,因为可能发生算术溢出。