正在载入在线练习界面,本页内容可直接阅读…

AK CSP › CSP-J 2026 第一轮真题 › 第 19 题

CSP-J 2026 第一轮 第 19 题:程序(一):将第 7 行的 while (n 0)

阅读程序 · 枚举与模拟 · 答案 A

题目

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int x = 1, y = 1;
    while (n > 0) {
        if (n % 2 == 0) {
            ++x;
        } else {
            ++x;
            ++y;
        }
        n = n / 2;
    }
    cout << x << ' ' << y << endl;
    return 0;
}

以下问题均假定输入的 $n$ 为不超过 $2^{31}- 1$ 的非负整数。

本小题

将第 7 行的 while (n > 0) 改为 while (n >= 0) 后,程序可能出现的问题是( )。

选项

  • A. 陷入死循环
  • B. 输出结果比原来大
  • C. 输出结果比原来小
  • D. 输出结果不受影响

答案

A

题解

答案是 A. 陷入死循环。

关键在于循环中的这句: ``cpp n = n / 2; ` 整数除法会舍去小数部分,所以正整数 n 不断除以 2,最终会变成 0`。

  • 原条件 n > 0:当 n == 0 时,条件不成立,循环结束。
  • 改成 n >= 0:当 n == 0 时,条件仍然成立;而 0 / 2 还是 0,因此循环一直无法结束,也就无法执行后面的输出语句。

如果一开始输入的就是 0,也会直接进入这种循环。

真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1 京公网安备11010502062986号