Bootstrap

2024年12月GESPC++三级真题解析

一、单选题(每题2分,共30分)

题目123456789101112131415
答案

B

D

A

A

D

B

C

A

A

D

D

C

D

C

A

1.下列二进制表示的十进制数值分别是( )
[10000011]原=( )

[10000011]补=( )

A. -125,-3

B. -3, -125

C. -3,-3

D. -125,-125

【答案】B

【考纲知识点】原码和补码的计算及转换

【解析】
原码:最高位为符号位,0 表示正数,1 表示负数。其余位表示数值大小。
[10000011]=-(26+21+20)
=-(64+2+1)
=-67
补码:正数的补码与原码相同,负数的补码是原码的数值位取反加 1。

[10000011]补=11111101
  =-(27-1+22+20)
  =-(128-1+4+1)
  =-125
所以答案是 B 选项。

2.关于计算机中的编码,下列说法中错误的是()

A. 对于无符号数,原码就是真值

B. 正数的反码是其本身

C. 负数的反码和补码是不一样的

D. 负数的反码,在其原码的基础上, 各个位取反

【答案】D

【考纲知识点】计算机编码,原码、反码、补码的概念

【解析】
A 选项,对于无符号数,原码就是其真值,该说法正确。

B 选项,正数的原码、反码、补码都相同,所以正数的反码是其本身,该说法正确。

C 选项,负数的反码和补码是不一样的,该说法正确。

D 选项,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。不是所有位取反,该说法错误。

综上所述,选择 D 选项。

3.16进制数B2025转换成8进制数是()

A. 2620045

B. 2004526

C. 729125

D. 2420045

【答案】A

【考纲知识点】不同进制之间的转换

【解析】
首先将十六进制数 B2025 转换为二进制:

B 对应的二进制是 1011,2 对应的二进制是 0010,0 对应的二进制是 0000,2 对应的二进制是 0010,5 对应的二进制是 0101 。

所以 B2025 转换为二进制是:10110010000000100101 。

然后从右往左每三位一组进行分组,不足三位的左边补 0 :

001 011 001 000 000 010 010 100

每组转换为八进制:

1 3 1 0 0 2 2 4

所以结果是 131000224 ,即 2620045 。

因此选择 A 选项。

4.625.625变成二进制是( )。

A. 1001110001.101

B. 101.101

C. 101.1001110001

D. 1001110001.1101
【答案】A

【考纲知识点】十进制数转换为二进制数

【解析】
整数部分:采用除 2 取余,逆序排列的方法。
625÷2=321·····1
321÷2=156·····0
 156÷2=78·····0
  78÷2=39·····0
  39÷2=19·····1
   19÷2=9·····1

9÷2=4·····1
4÷2=2·····0

从下往上取余数,得到整数部分的二进制为 1001110001 。

小数部分:采用乘 2 取整,顺序排列的方法。
0.625×2=1.25    取整1
  0.25×2=0.5    取整0
   0.5×2=1.0    取整1
小数部分的二进制为 0.101 。

所以 625.625 转换为二进制是 1001110001.101 。

答案选择 A 。

5.下面逻辑运算中,正确的是( )

A. 5&&3==0

B. 5|3==8

C. 5||3==11

D. 5&3==0001
【答案】D

【考纲知识点】逻辑运算与位运算

【解析】
A 选项,在 C++ 中,逻辑与(&&)运算,5 和 3 都非 0,所以 5 && 3 的结果为 1,不是 0,A 错误。

B 选项,按位或(|)运算,5 的二进制是 0101,3 的二进制是 0011,0101 | 0011 = 0111,即 7,不是 8,B 错误。

C 选项,逻辑或(||)运算,5 || 3 的结果为 1,不是 11,C 错误。

D 选项,按位与(&)运算,5 的二进制是 0101,3 的二进制是 0011,0101 & 0011 = 0001,D 正确。

综上所述,选择 D 选项。

6.补码1111 1101进行运算1111 1101>>1以后得到的结果是()

A. 1111 1100

B. -2

C. 1111 1101

D. 1111 1010
【答案】B

【考纲知识点】补码的移位运算

【解析】首先,补码 1111 1101 对应的原码是 1000 0011,其真值为 -3。

将补码 1111 1101 进行右移 1 位,得到 1111 1110。

1111 1110 对应的原码是 1000 0010,其真值为 -2。

所以选择 B 选项。

7.下列代码输出的是
string s="1234@@chenadai";

string str="12345";

s.replace(1,5,str);

cout<<s<<endl;

A. 12345

B. 2345@

C. 112345chenadai

D. 12345chenadai
【答案】C

【考纲知识点】字符串的操作,replace 函数的使用。

【解析】
在这段代码中,首先定义了字符串 s 为 "1234@@chenadai" ,字符串 str 为 "12345" 。

然后使用 replace 函数对 s 进行操作,replace(1, 5, str) 表示从 s 的索引 1 开始,长度为 5 的子串被替换为 str 。

即 "234@@" 被替换为 "12345" ,所以最终 s 变为 "112345chenadai" 。

因此,选择 C 选项。

8.a|10(a与10都是10进制,且二进制表示最高位为1)运算的结果是( )。

A. 使a的二进制表示从右往左的第二位为1

B. 使a的二进制表示从右往左的第一位为0

C. 使a的二进制表示从右往左第二位为0

D. 使a的二进制表示最高位为0
【答案】A

【考纲知识点】位运算中的按位或操作

【解析】
因为 a 和 10 的二进制表示最高位为 1,说明它们都是负数。

10 的二进制表示为 1010。

按位或运算时,只要对应位中有一个为 1 ,结果位就为 1 。

对于负数,进行位运算时是基于其补码进行的。

与 10 进行按位或运算,会使 a 的二进制表示从右往左的第二位为 1 。

所以选择 A 选项。

9.下列程序输出的是( )
string ch="hello";

if(ch[5]==NULL)

{

cout<<"right"<<endl;

}

else if (ch[5]=='\0')

{

cout<<"wrong"<<endl;

}

else

{

cout<<"hello"<<endl;

}

A. right

B. wrong

C. hello

D. 不能正确执行

【答案】A

【考纲知识点】字符串的操作和条件判断

【解析】在 C++ 中,字符串 "hello" 的有效字符是 'h'、'e'、'l'、'l'、'o' ,其长度为 5 。当访问 ch[5] 时,已经超出了字符串的有效范围。

在 C++ 中,访问超出字符串有效范围的索引通常返回未定义的行为,但在很多实现中,会表现为类似于 NULL 的情况。

在这个程序中,由于 ch[5] 超出范围,其表现类似于 NULL ,所以会输出 "right" 。

因此,选择 A 选项。

10.下列程序中,假设一个字符占用的内存空间是1,下列程序中,ch占用的内存空间是 ( )

char ch[] = "hello world";

size_t ret=strlen(ch);

cout<<ret<<endl;
A. 11

B. 10

C. 13

D. 12

【答案】D

【考纲知识点】字符数组和字符串长度

【解析】在 C++ 中,strlen 函数计算的是字符串的长度,不包括字符串结束标志 '\0' 。

字符串 "hello world" ,其中包含 11 个可见字符,但是 strlen 计算的长度不包括 '\0' ,所以字符串的实际长度是 11 - 1 = 10 。

但是定义的字符数组 ch ,需要为字符串结束标志 '\0' 预留空间,所以 ch 占用的内存空间是 11 + 1 = 12 。

因此,选择 D 选项。

11.下列程序最后输出的是()
int a=65;

cout<<tolower(a)<<endl;

A. 65

B. A

C. a

D. 97

【答案】D

【考纲知识点】字符转换函数 tolower

【解析】tolower 函数用于将大写字符转换为小写字符。

字符 'A' 的 ASCII 码值是 65,将其转换为小写就是 'a' ,而 'a' 的 ASCII 码值是 97。

所以程序最后输出 97,选择 D 选项。

12.想要计算从数字n到数字m之间(包含n和m)有多少个数字d出现,下列程序哪个能够实现( )。

A. 
int n,m,res,d;

cin >> n >> m>>d;

for(int i = n+1; i <= m; i++){

int temp = i;

while(temp){

if(temp % 10 == d) res++;

temp /= 10;

}

}

cout << res << endl;

return 0;

Bint n,m,res,d;

cin >> n >> m>>d;

for(int i = n; i <= m; i++){

int temp = i;

while(temp){

if(temp % 10 = d) res++;

temp /= 10;

}

}

cout << res << endl;

return 0;.

C.
int n,m,res=0,d;

cin >> n >> m>>d;

for(int i = n; i <= m; i++){

int temp = i;

while(temp){

if(temp % 10 == d) res++;

temp /= 10;

}

}

cout << res << endl;

return 0;

D.int n,m,res=0,d;

cin >> n >> m>>d;

for(int i = n; i <= m; i++){

while(temp){

if(temp % 10 == d) res++;

temp /= 10;

}

}

cout << res << endl;

return 0;


 

【答案】C

【考纲知识点】循环、条件判断、数字处理

【解析】
选项 A 中,循环从 n + 1 开始,会遗漏 n 这个数字,不符合要求。

选项 B 中,没有初始化 res 为 0,可能导致结果错误。

选项 C 中,首先正确初始化了 res 为 0,然后从 n 到 m 遍历每个数字,通过不断除以 10 并取余来判断每个数位是否为 d ,如果是则 res 加 1,能够正确计算从 n 到 m 之间数字 d 出现的次数。

选项 D 中,循环内部的变量 temp 没有被正确初始化。

综上所述,能够实现计算从数字 n 到数字 m 之间(包含 n 和 m )有多少个数字 d 出现的程序是选项 C。

13.兔子五元一只,鸡三元一只,小鸭子一元三只,现在你有一百元要买一百只,兔子、鸡、鸭子,问兔子、鸡、鸭子各买多少只,每种必须至少一只,下列哪个程序能实现。( )。

A.
for(int i = 0; i <= 100; i++){

for(int j = 0; j <= 100; j++){

for(int k = 0; k <= 100; k++){

if(i + j + k == 100 && 25 * i + 10 * j + k == 300)

cout << i << " " << j << " " << k << endl;

}

}

} 

B.
for(int i = 0; i <= 100; i++){

for(int j = 0; j <= 100; j++){

for(int k = 0; k <= 100; k++){

if(i + j + k == 100 && 20 * i + 10 * j + k == 300)

cout << i << " " << j << " " << k << endl;

}

}

}

C.
for(int i = 0; i <= 20; i++){

for(int j = 0; j <= 34; j++){

for(int k = 0; k <= 20; k++){

if(i + j + k == 100 && 15 * i + 9 * j + k == 300)

cout << i << " " << j << " " << k << endl;

}

}

}

D.
for(int i = 0; i <= 100; i++){

for(int j = 0; j <= 100; j++){

for(int k = 0; k <= 100; k++){

if(i + j + k == 100 && 15 * i + 9 * j + k == 300)

cout << i << " " << j << " " << k << endl;

}

}

}

【答案】D

【考纲知识点】多重循环、条件判断

【解析】
兔子 5 元一只,鸡 3 元一只,鸭子 1 元三只。

设兔子买了 i 只,鸡买了 j 只,鸭子买了 k 只。

因为一共 100 元买 100 只动物,所以有:

i + j + k = 100 (动物总数为 100)

5i + 3j + k/3 = 100 ,整理可得 15i + 9j + k = 300 (总花费为 100 元)

兔子最多买 20 只,鸡最多买 33 只(因为要保证至少买一只鸭子),鸭子的数量由前两个动物数量决定。

A 选项中条件 25 * i + 10 * j + k == 300 错误。

B 选项中条件 20 * i + 10 * j + k == 300 错误。

C 选项中循环范围限制错误,鸡最多可以买 33 只,不是 34 只。

D 选项中循环范围合理,并且条件 i + j + k == 100 && 15 * i + 9 * j + k == 300 正确。

综上所述,能实现要求的是 D 选项。

14.求小于等于N的素数的方法中,有一种方法是将所有从2到它本身减1的数都除一遍,如果不能整除,就是素数。下列哪个程序,体现了这种方法()

A. 
if(N >= 3){

cout<<2<<endl;

for(int i = 2;i <= N;i ++){

for(int j = 2;j < i;j ++){

if(i % j != 0){

flag = 1;

}

}

if(flag == 0){

cout<<i<<endl;

}

flag = 0;

}

}

B.
if(N >= 2){

for(int i = 3;i <= N;i ++){

for(int j = 2;j < i;j ++){

if(i % j == 0){

flag = 1;

}

}

if(flag == 0){

cout<<i<<endl;

}

flag = 0;

}

}

C.
if(N >= 2){

cout<<2<<endl;

for(int i = 3;i <= N;i ++){

for(int j = 2;j < i;j ++){

if(i % j == 0){

flag = 1;

}

}

if(flag == 0){

cout<<i<<endl;

}

flag = 0;

}

}

D.
if(N >= 2){

cout<<2<<endl;

for(int i = 3;i <= N;i ++){

for(int j = 2;j < i;j ++){

if(i % j == 0){

flag = 1;

}

}

if(flag == 0){

cout<<i<<endl;

}

}

}

【答案】C

【考纲知识点】素数判断算法、循环、条件判断

【解析】
A 选项:没有从 3 开始判断,且判断条件错误,应该是能整除就不是素数,设置 flag = 1 。

B 选项:没有先输出 2,2 也是素数。

C 选项:首先判断 N 是否大于等于 2,如果是,先输出 2。然后从 3 到 N 遍历每个数 i ,对于每个 i ,从 2 到 i - 1 遍历每个数 j ,如果 i 能被 j 整除(i % j == 0 ),就设置 flag = 1 ,表示不是素数。如果遍历完都没有能整除的,即 flag == 0 ,就输出 i ,是素数。这个程序符合题目要求。

D 选项:没有在每次内层循环结束后将 flag 重置为 0。

综上所述,选择 C 选项。

15.工人工作一天,会得到一个金环作为工资报酬,某个工作需要15天完成,一条15个环的金环项链,为了严格执行每天工作结束时,完成对工人工资的结算,最少需要将金环项链剪裁成几段,每段几个金环( )

A. 4段,分别是1、2,4,8

B. 15段,每段1个

C. 6段,分别是3、3、3、3、2、1

D. 9段,分别是2、2、2、2、2、2、1、1、1

【答案】A

【考纲知识点】二进制思想的应用

【解析】
将金环项链剪裁成 4 段,分别是 1、2、4、8 个金环。

使用二进制来表示 1 到 15:

1 用 1 表示

2 用 10 表示

3 用 11 表示,可由 1 + 2 得到

4 用 100 表示

5 用 101 表示,可由 1 + 4 得到

6 用 110 表示,可由 2 + 4 得到

7 用 111 表示,可由 1 + 2 + 4 得到

8 用 1000 表示

9 用 1001 表示,可由 1 + 8 得到

10 用 1010 表示,可由 2 + 8 得到

11 用 1011 表示,可由 1 + 2 + 8 得到

12 用 1100 表示,可由 4 + 8 得到

13 用 1101 表示,可由 1 + 4 + 8 得到

14 用 1110 表示,可由 2 + 4 + 8 得到

15 用 1111 表示,可由 1 + 2 + 4 + 8 得到

这样通过这 4 段不同数量的金环组合,可以满足 1 到 15 任意天数的工资结算需求,且段数最少。

所以选择 A 选项。

二、判断题(每题2分,共20分)

题目12345678910
答案

×

×

1. 为了简化计算机基本运算电路,使加减法都只需要通过加法电路实现,也就是让减去一个正数或加上一个负数这样的运算可以用加上一个正数来代替。于是改变负数存储的形式,存储成一种可以直接当成正数来相加的形式,这种形式就是补码。

【答案】正确

【考纲知识点】补码的概念和作用

【解析】在计算机中,为了方便硬件实现基本运算,采用补码来表示负数。通过补码的形式,计算机在进行加减法运算时,都可以统一使用加法电路来完成。

对于减去一个正数或加上一个负数的运算,通过将负数以补码形式存储,可以将其转换为加上一个正数的形式进行计算,从而简化了计算机的运算电路。

所以答案是正确。

2. 使用原码进行的计算, 2+(-1) 的结果是 -3

【答案】正确

【考纲知识点】原码的计算

【解析】原码中,正数的原码就是其本身,负数的原码是符号位为 1,数值位为其绝对值。

2 的原码是 00000010, -1 的原码是 10000001。

进行加法运算时:

00000010

10000001

———————

10000011

得到的结果 10000011 是 -3 的原码。

所以使用原码进行 2 + (-1) 的计算结果是 -3 ,答案是正确的。

3.反码计算加减法:加法与减法结果都是正确的,只是解决不了 -0 的问题

【答案】正确

【考纲知识点】反码的特点和运算

【解析】在反码表示中,正数的反码与原码相同,负数的反码是对原码的数值位逐位取反。

反码进行加法运算时,结果是正确的。但在进行减法运算时,虽然结果在数值上是正确的,但存在 “-0” 和 “+0” 两种表示形式,这会导致一些逻辑上的不一致和问题。

所以说反码计算加减法,加法与减法结果都是正确的,只是解决不了 “-0” 的问题,答案是正确。

4.10 进制数 63,在转换成二进制的计算过程中,产生了如下的式子:
63/2=31 余 1

31/2=15 余 1

15/2=7 余 1

7/2=3 余 1

3/2=1 余 1

1/2=0 余 1
按照从前往后的顺序,获得 63 的二进制值是 111111

【答案】错误

【考纲知识点】十进制转二进制的方法

【解析】将十进制数转换为二进制时,通过除 2 取余的方法,要按照从下往上的顺序排列余数才能得到正确的二进制值。

在这个计算过程中,最后的二进制值应该是从下往上读取余数,即 111111 是从后往前的顺序,正确的二进制值应该是从下往上,即 111111 从下往上读为 111111。

所以答案是错误。

5.下列程序输出的是 A
char x=65;

x=x&00001111;

cout<<x<<endl;

【答案】正确

【考纲知识点】位运算与字符操作

【解析】
字符 'A' 的 ASCII 码值是 65,对应的二进制是 01000001 。

00001111 的二进制是 00001111 。

进行按位与运算 01000001 & 00001111 ,得到 00000001 ,其对应的字符就是 'A' 。

所以该程序输出的是 A ,答案是正确的。

6.下列可执行程序段中,最后 pos 的值是 4
string str="chenADai";

int pos = str.find('D');

--pos&11;

【答案】正确

【考纲知识点】字符串操作和位运算

【解析】首先,str.find('D') 会返回字符 'D' 在字符串 str 中首次出现的位置,在 "chenADai" 中,'D' 首次出现在位置 5 ,所以初始时 pos 的值为 5 。

然后进行 --pos & 11 运算。

先 --pos ,此时 pos 的值变为 4 。

4 & 11 ( 11 的二进制为 1011 , 4 的二进制为 0100 )进行按位与运算得到 4 。

所以最后 pos 的值是 4 ,答案是正确的。

7.
string ch="chen";

cout<<ch[4]<<endl;
该段程序将不能正确执行

【答案】错误

【考纲知识点】字符串的访问

【解析】字符串 ch = "chen" ,其有效字符为 'c'、'h'、'e'、'n' ,长度为 4 。

当访问 ch[4] 时,已经超出了字符串的有效范围,在 C++ 中这种访问通常会导致未定义的行为,而不是一定不能正确执行。

所以答案是错误。

8.
char a='A';

a=a+32;

cout<<(int)a<<endl;
将输出 97

【答案】正确

【考纲知识点】字符的 ASCII 码值运算

【解析】
字符 'A' 的 ASCII 码值是 65,加 32 后得到 'a' 的 ASCII 码值 97。

将 a 强制转换为 int 类型输出,就是 97。

所以答案是正确的。

9. 自然界中,最小的素数是 2

【答案】正确

【考纲知识点】素数的定义

【解析】
素数是指一个大于 1 且除了 1 和它自身外,不能被其他自然数整除的数。

2 符合素数的定义,并且比 2 小的正整数 1 不符合素数的定义。

所以自然界中,最小的素数是 2,答案是正确的。

10.CCF(十六进制) = 12363(七进制)

【答案】正确

【考纲知识点】不同进制之间的转换

【解析】首先将十六进制的 “CCF” 转换为十进制:
(CCF)16
=12×162+12×161+15×160
=12×256+12×16+15×1
=3079+192+15
=3279

然后将七进制的 “12363” 转换为十进制:
(12363)7
=1×74+2×73+3×72+6×71+3×70
=1×2401+2×343+3×49+6×7+3×1
=2401+686+147+42+3
=3279
因为两者转换为十进制后的值相等,所以 “CCF (十六进制) = 12363 (七进制)” 这个表述是正确的。

三、编程题(每题25分,共50分)

 

1、数字替换

【问题描述】

小杨有一个包含n个数字的序列A ,即A={a1,a2,a3.....,an},他想将其中大于k的数字都替换为序列的最大值,将其中小于K的数字都替换为序列的最小值,请你帮他计算出替换后的序列。

【输入描述】

第一行包含两个正整数n,k,含义如题面所示
第二行包含n个数字,代表序列A 。

【输出描述】

输出n个整数,代表替换后的结果。

【样例输入 1】

5 0

-2 -1 0 1 2

【样例输出 1】

-2 -2 0 2 2

【题目大意】

给定一个包含 n 个数字的序列 A 以及一个数字 k ,需要将序列中大于 k 的数字替换为序列中的最大值,小于 k 的数字替换为序列中的最小值,然后输出替换后的序列。

【考纲知识点】
数组操作、循环、条件判断、最值求解。

【解题思路】

首先读入序列的长度 n 和判断数字 k 。然后遍历序列读入每个数字,同时求出序列的最大值和最小值。再次遍历序列,根据每个数字与 k 的大小关系进行替换。最后输出替换后的序列。

【参考程序】
#include <iostream>

#include <vector>

#include <algorithm>

using namespace std;

int a[100010];

int main() {

int n, k;

cin >> n >> k;

for (int i = 1; i <=n; i++) {

cin >> a[i];

}

int max_value = a[1],min_value=a[1];

for (int i = 1; i <=n; i++) {

max_value=max(max_value,a[i]);

min_value=min(min_value,a[i]);

}

for (int i = 1; i <=n; i++) {

if (a[i] > k) {

a[i] = max_value;

} else if (a[i] < k) {

a[i] = min_value;

}

if (i != n) {

cout << a[i] << " ";

} else {

cout << a[i] << endl;

}

}

return 0;

}
【程序解析】
#include <iostream>、#include <vector>、#include <algorithm>:引入所需的标准库。

int a[100010];:定义一个足够大的整数数组来存储序列。

int main():主函数。

cin >> n >> k;:读入序列长度 n 和判断数字 k 。

外层循环通过比较更新得到序列的最大值 max_value 和最小值 min_value 。

内层循环根据数字与 k 的大小关系进行替换,并按要求输出替换后的数字。

2、打印数字

【问题描述】

小杨为数字0 , 1, 2和3 设计了一款表示形式,每个数字占用了5×5的网格。数字 0, 1,2 和3 的表示形式如下:
..... ****. ..... .....

.***. ****. ****. ****.

.***. ****. ..... .....

.***. ****. .**** ****.

..... ****. ..... .....
小杨想请你将给定的数字n转换为对应的表示形式。

【输入描述】

第一行包含一个正整数代表 。

【输出描述】

输出对应的表示形式

【样例输入 1】

12230

【样例输出 1】

****.....................

****.****.****.****..***.

****.................***.

****..****.********..***.

****.....................

【题目大意】

给定一个由数字 0、1、2、3 组成的字符串,按照给定的每个数字的 5×5 网格表示形式,将这个字符串转换并输出对应的图形表示。

【考纲知识点】
字符串操作、条件判断、循环。

【解题思路】

首先读入一个包含数字的字符串。然后通过两层循环,外层控制行,内层遍历字符串中的每个数字。根据当前数字和所在的行,确定对应的表示形式并添加到当前行的输出字符串中。最后逐行输出结果。

【参考程序】
#include <iostream>

#include <string>

using namespace std;

int main() {

string n;

cin >> n;

for (int row = 0; row < 5; row++) {

string line = "";

for (char digit : n) {

if (digit == '0') {

if (row == 0 || row == 4) {

line += ".....";

} else {

line += ".***.";

}

} else if (digit == '1') {

line += "****.";

} else if (digit == '2') {

if (row == 0) {

line += ".....";

} else if (row == 1) {

line += "****.";

} else if (row == 2) {

line += ".....";

} else if (row == 3) {

line += ".****";

} else {

line += ".....";

}

} else if (digit == '3') {

if (row == 0) {

line += ".....";

} else if (row == 1) {

line += "****.";

} else if (row == 2) {

line += ".....";

} else if (row == 3) {

line += "****.";

} else {

line += ".....";

}

}

}

cout << line << endl;

}

return 0;

}
程序解析
#include <iostream>、#include <string>:引入所需的标准库。

int main():主函数。

string n; cin >> n;:读入数字组成的字符串。

外层的两个嵌套循环,外层的 for 循环控制行数,内层的 for 循环遍历输入字符串中的每个数字。

内层通过一系列 if-else 语句根据数字和当前行数确定对应的表示片段,并添加到 line 字符串中。

每处理完一行,输出当前行的结果。

;