信息学奥赛初赛天天练-36-CSP-J2021阅读程序-ASCII、运算符优先级、二进制补码存储、模拟算法应用
信息学奥赛初赛天天练-36-CSP-J2021阅读程序-ASCII、运算符优先级、二进制补码存储、模拟算法应用
PDF文档公众号回复关键字:20240626
![](https://img2022.cnblogs.com/blog/404484/202211/404484-20221123185906168-1425738362.png)
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
作者:newcode 更多资源请关注纽扣编程微信公众号
从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习