正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-J 2020 第一轮真题 › 第 21 题
CSP-J 2020 第一轮 第 21 题:程序(一):输出CSPCSPCSPCSP能推出什么
题目
#include <cstdlib>
#include <iostream>
using namespace std;
char encoder[26] = {'C','S','P',0};
char decoder[26];
string st;
int main() {
int k = 0;
for (int i = 0; i < 26; ++i)
if (encoder[i] != 0) ++k;
for (char x ='A'; x <= 'Z'; ++x) {
bool flag = true;
for (int i = 0; i < 26; ++i)
if (encoder[i] ==x) {
flag = false;
break;
}
if (flag) {
encoder[k]= x;
++k;
}
}
for (int i = 0; i < 26; ++i)
decoder[encoder[i]- 'A'] = i + 'A';
cin >> st;
for (int i = 0; i < st.length( ); ++i)
st[i] = decoder[st[i] -'A'];
cout << st;
return 0;
}
本小题
若输出的字符串为 $\texttt{CSPCSPCSPCSP}$,则下列说法正确的是( )。选项
- A. 输入的字符串中既有 P 又有 K
- B. 输入的字符串中既有 J 又有 R
- C. 输入的字符串中既有 J 又有 K
- D. 输入的字符串中既有 P 又有 R
答案
D
题解
正确答案是 D。关键是看清 encoder 和 decoder 的对应关系。
先把 encoder 补全:前三个字符是 C、S、P,随后按字母顺序填入剩下的字母,跳过已经出现的 C、S、P:
``text 下标对应字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ encoder 内容:CSPABDEFGHIJKLMNOQRTUVWXYZ ``
接着这句代码建立反向映射:
``cpp decoder[encoder[i] - 'A'] = i + 'A'; ``
也就是说,输入字符为 encoder[i] 时,输出的是第 i 个字母(从 0 开始)。
因此,根据输出反推输入:
| 输出字符 | 下标 i | 输入字符 encoder[i] |
|---|---|---|
| C | 2 | P |
| S | 18 | R |
| P | 15 | N |
输出为 CSPCSPCSPCSP,输入就必须是:
``text PRNPRNPRNPRN ``
其中既有 P 又有 R,所以选 D。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号