正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2026 第一轮真题 › 第 32 题
CSP-J 2026 第一轮 第 32 题:程序(三):下列关于该程序输出的说法中,正确的是
题目
#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号