阅读程序2解析

 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

Scroll to Top