学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_csp历年真题_热爱编程的通信人的博客-CSDN博客
#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; //k=3
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) { //如果x未在encoder中出现
encoder[k] = x;
++k;
}
}
//循环结束encoder = [C,S,P,A,B,D,E,F...]
for (int i = 0; i < 26; ++i)
decoder[encoder[i] - 'A'] = i + 'A'; //d['C']='A' e['A']='C'
//循环结束decoder = [D,E,A,F,G,H,I,J...]
cin >> st;
for (int i = 0; i < st.length(); ++i)
st[i] = decoder[st[i] - 'A'];
cout << st;
return 0;
}
16、输入的字符串应当只由大写字母组成,否则在访问数组时可能越界。( )
【答案】:对
【解析】
decoder的范围是0-26,30行是st[i]-'A',所以st[i]必须是大写字母。
17、若输入的字符串不是空串,则输入的字符串与输出的字符串一定不一样。( )
【答案】:错
【解析】
encoder = [C S P A B D E F G H I J K L M N O Q R T U V W X Y Z]
decoder = [D E A F G H I J K L M N O P Q C R S B T U V W X Y Z]
两个字符列表,从T以后加密和解密都是自己。所以是错误的
18、将第12行的“i < 26”改为“i < 16”,程序运行结果不会改变。( )
【答案】:
【解析】
第13行的目的是求出k=3,改为i<16后,k还是等于3,所以结果不变
19、将第26行的“i < 26”改为“i < 16”,程序运行结果不会改变。( )
【答案】:错
【解析】
如果只求前16个,那后10的decoder的值就会发生变化
20、若输出的字符串为“ABCABCABCA”, 则下列说法正确的是( A )
A.输入的字符串中既有S又有 P
B.输入的字符串中既有 S 又有 B
C.输入的字符串中既有 A 又有P
D.输入的字符串中既有 A 又有 B
【答案】:
【解密】
输出(解密)的字符为A,那就是加密之前是A,输入的字符就应该是加密后的字符。
加密前 = [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
加密后 = [C S P A B D E F G H I J K L M N O Q R T U V W X Y Z]
即encoder[A]=C,encoder[B]=S,encoder[C]=P
decoder[C]=A,decoder[S]=B,decoder[P]=C
21、若输出的字符串为“CSPCSPCSPCSP”,则下列说法正确的是( D )
A.输入的字符串中既有P又有 K
B.输入的字符串中既有 J 又有 R
C.输入的字符串中既有 J 又有 K
D.输入的字符串中既有 P 又有 R
加密前 = [A B C D E F G H I J K L M N O P Q R S T U V W X Y Z]
加密后 = [C S P A B D E F G H I J K L M N O Q R T U V W X Y Z]
即encoder[C]=P,encoder[S]=R,encoder[P]=N
decoder[P]=C,decoder[R]=S,decoder[N]=P