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

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

CSP-J 2026 第一轮 第 32 题:程序(三):下列关于该程序输出的说法中,正确的是

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

题目

#include <iostream>
using namespace std;
bool check_prime(int x) {
    if (x <= 1) return false;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) return false;
    }
    return true;
}
int n;
void search_result(int x) {
    if (!check_prime(x)) return;
    if (x >= n) {
        cout << x << endl;
        return;
    }
    for (int i = 0; i <= 9; i++) {
        search_result(x * 10 + i);
    }
}
int main() {
    cin >> n;
    for (int i = 1; i <= 9; i++) search_result(i);
    return 0;
}

本小题

下列关于该程序输出的说法中,正确的是( )。

选项

  • A. 输出的数一定按照从小到大的顺序排列
  • B. 随着输入 $n$ 的增大,输出的行数一定不会增加
  • C. 输出的数的个位数字只可能是 3 或 7
  • D. 输出的每个大于等于 10 的数,十进制下删去它的末位数字后得到的数一定是质数

答案

D

题解

正确答案是 D。

这段递归的关键是:只有当前的 x 是质数,程序才会输出它,或在它的末尾添加一位数字继续搜索。

``cpp if (!check_prime(x)) return; // 不是质数,直接结束 if (x >= n) { cout << x << endl; // 达到 n,输出并停止这一分支 return; } ``

逐项分析:

  • A 错误:程序按递归分支搜索,不保证数值从小到大。例如输入 n = 3,输出依次为:

``text 23 29 3 5 7 ` 因为程序先搜索完以 2 开头的分支,再搜索 3`。

  • B 错误:输入 n = 2 时,输出 2、3、5、7,共 4 行;输入 n = 3 时,如上所示,共 5 行。所以 n 增大,输出行数可能增加。
  • C 错误:上面的输出中有 29,个位是 9;也可能直接输出一位质数 2 或 5。
  • D 正确:每个输出的两位及以上的数,都是通过

``cpp search_result(x * 10 + i); ` 产生的。删去末位数字,得到的正是上一层的 x`。上一层只有通过质数检查,才会执行这条递归调用,因此删去末位后得到的数一定是质数。

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