信息学奥赛初赛天天练-36-CSP-J2021阅读程序-ASCII、运算符优先级、二进制补码存储、模拟算法应用

信息学奥赛初赛天天练-36-CSP-J2021阅读程序-ASCII、运算符优先级、二进制补码存储、模拟算法应用
PDF文档公众号回复关键字:20240626

2021 CSP-J 阅读程序2

1 阅读程序(判断题1.5分 选择题3分 共计40分 )

#include<stdio.h>
#include<string.h>

char base[64];
char table[256];
char str[256];
char ans[256];

void init()
{
	for(int i=0;i<26;i++) base[i]='A'+i;
	for(int i=0;i<26;i++) base[26+i]='a'+i;
	for(int i=0;i<10;i++) base[52+i]='0'+i;
	base[62]='+',base[63]='/';
	
	for(int i=0;i<256;i++) table[i]=0xff;
	for(int i=0;i<64;i++) table[base[i]]=i;
	table['=']=0;
}

void decode(char *str)
{
	char *ret = ans;
	int i,len = strlen(str);
	for(i=0;i<len;i+=4){
		(*ret++) =table[str[i]]<<2|table[str[i+1]]>>4;
		if(str[i+2]!='=')
			(*ret++)=(table[str[i+1]]&0x0f)<<4|table[str[i+2]]>>2;
		if(str[i+3]!='=')
			(*ret++)=table[str[i+2]]<<6|table[str[i+3]];
	}
}

int main()
{
	init();
	printf("%d\n",(int)table[0]);
	
	scanf("%s",str);
	decode(str);
	printf("%s\n",ans);
	return 0;	
}

判断题

22.输出的第二行一定是由小写字母、大写字母、数字和"+"、"/"、"="构成的字符串( )

23.可能存在输入不同,但输出的第二行相同的情形( )

24.输出的第一行为"-1" ( )

单选题

25.设输入字符串长度为n,decode函数的时间复杂度为( )

A. O(sqrt(n))

B. O(n)

C. O(n log n)

D. O(n^2)

26.当输入为"Y3Nx"时,输出的第二行为( )

A. "csp"

B. "csq"

C. "CSP"

D. "Csp"

27.(3.5分)当输入为"Y2NmIDIwMjE"时,输出的第二行为( )

A. "ccf2021"

B. "ccf2022"

C. "ccf 2021"

D. "ccf 2022"

2 相关知识点

1) ASCII码

字符是一种图形符号,不同国家不同地区都有自己特殊的字符,于是就衍生了“字符集合”这个名词。其中ASCII (American Standard Code for Information Interchange: 美国信息交换标准代码)是国际通用的标准字符集

例如

char a='0';
char b='P';
char c='@';
char c='65';//ascii 码 对应大写字母A

ASCII码表

2) 运算符优先级

本题涉及到的位运算的优先级如下

位移 > 按位与  > 按位或

<<  >    &    >   |
  

3) 0xff

计算机存储使用二进制补码存储

0xff对应二进制补码(如果存储在1个字节中,二进制第1位为符号位,1开头为负数)

11111111

反码为:

11111110

原码为

10000001

对应十进制-1

3 思路分析

本程序主要使用模拟算法,计算量巨大,根据程序逻辑先初始化如下表格

本程序初始化base数组如下

table数组如下

常用ASCII

输入字符串后,把字符串每4个一组进行处理,分别进行如下3段程序处理

1
(*ret++) =table[str[i]]<<2|table[str[i+1]]>>4;
2
if(str[i+2]!='=')
	(*ret++)=(table[str[i+1]]&0x0f)<<4|table[str[i+2]]>>2;
3
if(str[i+3]!='=')
	(*ret++)=table[str[i+2]]<<6|table[str[i+3]];
上面3句程序,没句最多输出一个字符,存放到数字ans中
最后输出数组ans

22.输出的第二行一定是由小写字母、大写字母、数字和"+"、"/"、"="构成的字符串( F )

分析

计算过程使用小写字母、大写字母、数字作为table的下标,值为0~63,但0 ~ 63 经过decode解码后不一定是这些字符,例如有空格的输出

23.可能存在输入不同,但输出的第二行相同的情形( T )

分析

只有输入小写字母、大写字母、数字时,table下标的内容才会找到对应字符进行转换,如果不是这些table的值默认为0xff,转换后输出相同

24.输出的第一行为"-1" ( T )

分析

table[0]没有被赋值,默认赋值为0xff

0xff对应二进制补码(如果存储在1个字节中,二进制第1位为符号位,1开头为负数)

11111111

反码为:

11111110

原码为

10000001

对应十进制-1

单选题

25.设输入字符串长度为n,decode函数的时间复杂度为( B )

A. O(sqrt(n))

B. O(n)

C. O(n log n)

D. O(n^2)

分析

程序主语一个for循环,长度为n

虽然有i+=4的跳步,达不到sqrt和log

26.当输入为"Y3Nx"时,输出的第二行为( B )

A. "csp"

B. "csq"

C. "CSP"

D. "Csp"

分析

根据列出的表格和输入,对3行代码逐行输出

Y3Nx时,第1行代码,输出c

Y3Nx时,第2行代码,输出s

Y3Nx时,第3行代码,输出q

所以输出csq

27.(3.5分)当输入为"Y2NmIDIwMjE="时,输出的第二行为( C )

A. "ccf2021"

B. "ccf2022"

C. "ccf 2021"

D. "ccf 2022"

分析

根据列出的表格和输入,对3行代码逐行输出

第1个4个字符 Y2Nm

Y2Nm时,第1行代码,输出c

Y2Nm时,第2行代码,输出c

Y2Nm时,第3行代码,输出f

第2个4个字符 IDIw

IDIw时,第1行代码,输出 空格

IDIw时,第2行代码,输出 2

IDIw时,第3行代码,输出 0

第3个4个字符 MjE=

MjE=时,第1行代码,输出 2

MjE=时,第2行代码,输出 1

MjE=时,第3行代码,不满足if判断条件,不输出

所以输出为ccf 2021

posted @ 2024-06-26 22:36  new-code  阅读(0)  评论(0编辑  收藏  举报