- C++
备战CSP-J初赛21天打卡计划。DAY16-编码解码
- 2024-9-12 14:26:21 @
编解码题目由于便于命题和设问是初赛的阅读理解题目的常客,最近3年就有2次考察。
常见的考察方法:
1.和位运算进行结合
2.和数据类型结合,如自然溢出等的处理
编码解码的由来
计算机只懂得0和1(即二进制),但人与人的交流是通过字符进行交流。
狭义的编码和解码就是字符和0与1之间进行转换。
编码:将字符按照对应的编码类型转换成计算机能够识别的0或者1。
解码:将0和1根据对应的解码类型转换成我们能够读懂的字符。
广义上看,人类社会广泛使用的密码就是一种编码方式。而密码的历史甚至可以追溯到公元前400年的古希腊时代。
解决编解码题目的思路和技巧
编解码题目命题虽然灵活多变的,但形式上一般都是一种输入经过一些计算,而成为另一串字符或数字。
首先是手算,如果编解码题目出现在阅读理解的第一题,建议可以硬算到底。而如果出现在阅读理解2,3题的位置,建议是通过硬算,寻找一些规律,即便最后没有寻找到规律也可以拿到题目中的部分分。
同时编解码题目最近两年的命题趋势看,也是对位运算,数据类型,进制数字的值的综合考察,所以也要熟练掌握这三部分内容。
历年真题
2021CSP普及组第17道题阅读程序题
1 #include <stdio.h>
2 #include <string.h>
3
4 char base[64];
5 char table[256];
6 char str[256];
7 char ans[256];
8
9 void init()
10 {
11 for (int i = 0; i < 26; i++) base[i] = 'A' + i;
12 for (int i = 0; i < 26; i++) base[26 + i] = 'a' + i;
13 for (int i = 0; i < 10; i++) base[52 + i] = '0' + i;
14 base[62] = '+', base[63] = '/';
15
16 for (int i = 0; i < 256; i++) table[i] = 0xff;
17 for (int i = 0; i < 64; i++) table[base[i]] = i;
18 table['='] = 0;
19 }
20
21 void decode(char *str)
22 {
23 char *ret = ans;
24 int i, len = strlen(str);
25 for (i = 0; i < len; i += 4) {
26 (*ret++) = table[str[i]] << 2 | table[str[i + 1]] >> 4;
27 if (str[i + 2] != '=')
28 (*ret++) = (table[str[i + 1]] & 0x0f) << 4 | table[str[i + 2]] >> 2;
29 if(str[i + 3] != '=')
30 (*ret++) = table[str[i + 2]] << 6 | table[str[i + 3]];
31 }
32 }
33
34 int main()
35 {
36 init();
37 printf("%d\n", (int)table[0]);
38
39 scanf("%s", str);
40 decode(str);
41 printf("%s\n", ans);
42 return 0;
43 }
•判断题 1)输出的第二行一定是由小写字母、大写字母、数字和”+”、”/”、”=”构成的字符串。()
2)可能存在输入不同,但输出的第二行相同的情形。()
3)输出的第一行为”-1”。()
•单选题
4)设输入字符串长度为n, decode函数的时间复杂度为()
5)当输入为”Y3Nx”时,输出的第二行为()
6)当输入为”Y2NmIDIwMjE=”时,输出的第二行为()
A.正确 B.错误
A.正确 B.错误
A.正确 B.错误
A.O(√n) B.O(n) C.O(nlogn) D.O(n2)
A.”csp” B.“csq” C.”CSP” D.“Csp”
A.”ccf2021” B.”ccf2022” C.”ccf 2021” D.”ccf 2022”
2020CSP普及组第16道题阅读程序题
1 #include <cstdlib>
2 #include <iostream>
3 using namespace std;
4
5 char encoder[26] = {'C','S','P',0};
6 char decoder[26];
7
8 string st;
9
10 int main() {
11 int k = 0;
12 for (int i = 0; i < 26; ++i)
13 if (encoder[i] != 0) ++k;
14 for (char x ='A'; x <= 'Z'; ++x) {
15 bool flag = true;
16 for (int i = 0; i < 26; ++i)
17 if (encoder[i] ==x) {
18 flag = false;
19 break;
20 }
21 if (flag) {
22 encoder[k]= x;
23 ++k;
24 }
25 }
26 for (int i = 0; i < 26; ++i)
27 decoder[encoder[i]- 'A'] = i + 'A';
28 cin >> st;
29 for (int i = 0; i < st.length(); ++i)
30 st[i] = decoder[st[i] -'A'];
31 cout << st;
32 return 0;
33 }
1 #include <cstdio>
2 #include <cstring>
3 using namespace std;
4 char st[100];
5 int main() {
6 scanf("%s", st);
7 int n = strlen(st);
8 for (int i = 1; i <= n; ++i) {
9 if (n % i == 0) {
10 char c = st[i - 1];
11 if (c >= 'a')
12 st[i - 1] = c - 'a' + 'A';
13 }
14 }
15 printf("%s", st);
16 return 0;
17 }
2019CSP普及组第16道题阅读程序题
5.
A. 18
B. 6
C. 10
D. 1
A. 36 B. 100000 C. 1 D. 128
1 条评论
-
mrhowe SU @ 2024-9-12 14:30:55
2021CSP普及组第17道题阅读程序题
- 第一空(1.5分): B
- 第二空(1.5分): A
- 第三空(1.5分): A
- 第四空(3分): B
- 第五空(3分): B
- 第六空(3.5分): C
2020CSP普及组第16道题阅读程序题
- 第一空(1.5分): A
- 第二空(1.5分): B
- 第三空(1.5分): A
- 第四空(1.5分): B
- 第五空(3分): A
- 第六空(3分): D
2019CSP普及组第16道题阅读程序题
- 第一空(1.5分): B
- 第二空(1.5分): A
- 第三空(1.5分): B
- 第四空(1.5分): A
- 第五空(3分): B
- 第六空(3分): B
- 1