1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | /**************************************************************** * Description: 2021_J_finish_program_2 * Date: 2023-08-31 10:02:17 * LastEditTime: 2023-08-31 21:06:23 ****************************************************************/ #include <iostream> #include <string> using namespace std; char base[64]; char table[256]; //初始化base和table数组 void init(){ for (int i = 0; i < 26; i++) base[i] = 'A' + i; //base数组0~25存A~Z for (int i = 0; i < 26; i++) base[26 + i] = 'a' + i; //26~51存a~z for (int i = 0; i < 10; i++) base[52 + i] = '0' + i; //52~61 存0~9 base[62] = '+', base[63] = '/'; // 62存+,63存/ for (int i = 0; i < 256; i++) table[i] = 0xff; //char类型,用16进制初始化,11111111=-1 for (int i = 0; i < 64; i++) table[base[i]] = i; //对table按base数组的值做下标进行赋值 table['='] = 0; } string decode(string str){ string ret; int i=0; for (i = 0; i < str.size(); i += 4) { //循环按每4个 // ret+=table[str[i]]; ret += table[str[i]] <<2 | table[str[i + 1]] >> 4; //生成新字符给ret字符串 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]]; } } return ret; } int main(){ init(); for (int i = 0; i <64; i++){ cout<<base[i]<<' '; } cout<<endl; for (int i = 0; i < 256; i++){ cout<<(int)table[i]<<' '; } cout << ((int)table[0])<< endl; string str; cin >> str; // decode(str); cout<<decode(str)<< endl; return 0; } |
22、输出的第二行一定是由小写字母、大写字母、数字和 ++、 //、== 构成的字符串。(错)
参见27题答案,有空格
23、可能存在输入不同,但输出的第二行相同的情形。(正确 )
26题“Y3”和27题“Y2”都后输出第二行都是’c’
24、输出的第一行为-1。( 正确 )
table[i]=0xff
table[]的类型是char,即signed char,1个字节,int,即signed int,4个字节。
signed char强制类型转化成int,则前面的三个字节补char的最高位,也就是1,补完后是0xffffffff,这个补码,转化后的数值是-1
25、设输入字符串长度为 n,decode
函数的时间复杂度为( O(n))
decode函数的for循环次数n/4 复杂度为O(n)
26、当输入为 Y3NxY3Nx 时,输出的第二行为( csq )。
str=”Y3Nx” str[0]=’Y’, str[1]=’3′ , str[2]=’N’ str[3]=’x’
table[str[0]]=24 24的2进制:00011000 左移两位:01100000
table[str[1]]=55 55的2进制:00110111 右移四位:00000011
按位或:01100011
10进制是99 ,ascii码对应的字符是c
table[str[1]]=55 55的2进制:00110111
0x0f: 00001111
按位与: 00000111 左移四位:01110000
table[str[2]]=13 13的2进制:00001101 右移两位:00000011
按位或: 01110011
10进制是115,ascii码对应的字符是s
table[str[2]]=13 13的2进制:00001101 左移六位:01000000
table[str[3]]=49 49的2进制:00110001
按位或: 01110001
10进制是113 ,ascii码对应的字符是q
27、当输入为 Y2NmIDIwMjE=Y2NmIDIwMjE= 时,输出的第二行为( ccf 2021 )。
因为每string每四个字符,输出3个字符,前8个字符输出6个,string最后一个字符是”=’,所以只输出2个字符,ret共有8个字符。
str[8-11]=”MJE=”, str[8]=’M’ str[9]=’j’ str[10]=’E’ str[11]=’=’
table[str[9]]=35. 35的2进制是00100011, 00100011&0x0f= 00100011&00001111=00000011, 位运算左移4位:01100000
table[str[10]]=4, 4的2进制00000100, 右移2位00000001
01100000
按位或 00000001
00110001 进进制是49,asc码对应字符是1