• 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	}

image image image image image

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道题阅读程序题

image 5. A. 18 B. 6 C. 10 D. 1

A. 36 B. 100000 C. 1 D. 128

1 条评论

  • @ 2024-9-12 14:30:55

    2021CSP普及组第17道题阅读程序题

    • 第一空(1.5分): B
    • 第二空(1.5分): A
    • 第三空(1.5分): A
    • 第四空(3分): B
    • 第五空(3分): B
    • 第六空(3.5分): C

    image image image image

    2020CSP普及组第16道题阅读程序题

    • 第一空(1.5分): A
    • 第二空(1.5分): B
    • 第三空(1.5分): A
    • 第四空(1.5分): B
    • 第五空(3分): A
    • 第六空(3分): D

    image image

    2019CSP普及组第16道题阅读程序题

    • 第一空(1.5分): B
    • 第二空(1.5分): A
    • 第三空(1.5分): B
    • 第四空(1.5分): A
    • 第五空(3分): B
    • 第六空(3分): B

    image

    • 1