GESP三级模拟试卷1

题目

1 单选题(每题2分,共30分)

1. 下列关于C++数组定义的说法中,正确的是( )。
A. int arr[3] = {1, 2, 3, 4};
B. char str[] = "Hello";  
C. float f[2] = {1.0, 2.0, 3.0};
D. double d[] = {1.0, 2.0};
2. 在下列编码中,与二进制"1010 1010"相等的是( )。
A. (AA)16进制
B. (252)10进制
C. (322)8进制  
D. (A2)16进制
3. 下面C++代码执行后输出的是( )。
string str = "GeekBang";
cout << str.substr(2, 4) << endl; 
A. GeekBang
B. ekBa
C. Geek
D. Bang
4. 执行下面C++代码后,输出是( )。
int x = 10;
x -= 3;
cout << x-- << endl;
A. 10
B. 7
C. 6
D. 3
5. 执行下面C++代码后输出的是( )。
int a = 3;
int b = 4;
cout << (a^b) << endl;
A. 7 
B. 1
C. 12
D. 10
6. 执行下面C++代码后输出的是( )。
char str[] = "Geeky";  
cout << str[10] << endl;
A. 输出空格
B. 输出'\0' 
C. 输出'y'
D. 程序崩溃
7. 下面C++代码执行后的输出是( )。
cout << 7/2.0 << endl;  
A. 3.5
B. 3
C. 4
D. 3.0
8. 下面C++代码用于判断某个字符是否是字母,当输入为'H'时,横线上应填入的代码是( )。
char c;
cin >> c; 
if ( ________ )
   cout << "ALPHA" << endl;
else  
   cout << "NOT ALPHA" << endl;
A. c >= 65 && c <= 90
B. c >= 'A' && c <= 'Z'
C. c > 64 && c < 91  
D. c > 'A'&& c < 'Z'
9. 64位计算机中,C++的整型变量long long的取值范围是( )。
A. -2^63 ~ 2^63-1
B. -2^31 ~ 2^31-1
C. 0 ~ 2^64-1
D. -2^32 ~ 2^32-1  
10. 下面C++程序执行的结果是( )。
int i = 0;
do {
  ++i;  
} while (i < 5);
cout << i << endl; 
A. 4
B. 5
C. 6
D. 死循环
11. C++的动态内存分配使用什么运算符( )。
A. malloc
B. alloc
C. new
D. create
12. 下面的C++代码的输出结果是( )。
int a = 10;
a += (a -= (a-=a)); 
cout << a << endl;
A. 10 
B. 20
C. 0
D. 30
13. 以下C++代码输出的结果是( )。
for (int i = 10; i > 6; i -= 2) 
    cout << i << " ";
A. 10 8 6
B. 10 8  
C. 8 6
D. 10 8 6 4 2 0
14. 计算机内部使用( )进制数。
A. 二进制
B. 八进制
C. 十进制
D. 十六进制
15. 一个完整的计算机系统包括( )。
A. 硬件系统
B. 软件系统
C. 硬件系统和软件系统  
D. 以上都不对

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

1. 执行C++代码 cout << (100 && 0) << endl; 输出结果为1。( )
2. 在C++中,字符串比较可以直接使用><==等操作符。( )
3. 执行C++代码 (2 || 0) && (3 && 1) 的结果为0。( )
4. 下面的C++代码会输出"HELLO"。( )  
char str[10] = "HELLO";
str[1] = 'E';  
cout << str << endl;
5. 执行下面C++代码,会输出1 2 3 4 5。( )
int a[] = {1, 2, 3, 4, 5};
for (int i = 1; i <= 4; i++)  
    cout << a[i] << " "; 
6. 下面的C++代码会发生除零错误。( )
int a = 0, b = 5;
cout << b/a << endl;
7. 执行下面C++代码会输出5。( ) 
int i = 0, s = 0;
do {
  s += ++i;
} while (i < 4);  
cout << s << endl;
8. 执行下面C++代码,会输出1。( )
int x = 1;
switch(x) {
  case 1: cout<<"1"<<endl; 
  case 2: cout<<"2"<<endl; break;
  default: cout<<"d"<<endl;
}  
9. Visual C++是一个C++的集成开发环境。( )
10. while循环和for循环可以完全等价地相互转换。( )

3 编程题(每题25分,共50分)

3.1 编程题1

试题名称:数列求和

问题描述:

给定一个正整数N,求以下数列的和:
1 + 1/2 + 1/3 + 1/4 + … + 1/N
要求保留5位小数。

输入描述:

输入一个正整数N。其中 1 <= N <= 1000000。

输出描述:

输出数列的和,保留5位小数。

样例输入:

3

样例输出:

1.83333

3.2 编程题2

试题名称:字符串压缩

问题描述:

给定一个字符串,请你将连续重复的字符压缩成"字符+连续出现次数"的格式。
如果某个字符连续出现少于2次,则保持原样不进行压缩。

输入描述:

一行字符串,字符串中只包含大小写英文字母,字符串长度不超过1000。

输出描述:

输出压缩后的字符串。

样例输入1:

aaaabcccaaa

样例输出1:

a4bc3a3

样例输入2:

abcdef  

样例输出2:

abcdef

解析

1 单选题(每题2分,共30分)

1. 下列关于C++数组定义的说法中,正确的是( )。
A. int arr[3] = {1, 2, 3, 4};
B. char str[] = "Hello";  
C. float f[2] = {1.0, 2.0, 3.0};
D. double d[] = {1.0, 2.0};
解析:
A选项中数组arr的大小为3,但初始化列表中给出了4个元素,不符合数组定义规则。
B选项正确,字符数组str的大小根据初始化的字符串常量自动确定。
C选项中数组f的大小为2,但初始化列表中给出了3个元素,不符合数组定义规则。
D选项正确,数组d的大小根据初始化列表中的元素个数自动确定为2。
因此本题答案为B。
2. 在下列编码中,与二进制"1010 1010"相等的是( )。
A. (AA)16进制
B. (252)10进制
C. (322)8进制  
D. (A2)16进制
解析:
二进制数"1010 1010"转换为十进制为170。
将170转换为各种进制数:
A. (AA)16 = 10*16 + 10 = 170
B. (252)10 = 2*100 + 5*10 + 2 = 252 
C. (322)8 = 3*64 + 2*8 + 2 = 210
D. (A2)16 = 10*16 + 2 = 162
因此与二进制"1010 1010"相等的是(AA)16,答案为A。
3. 下面C++代码执行后输出的是( )。
string str = "GeekBang";
cout << str.substr(2, 4) << endl; 
A. GeekBang
B. ekBa
C. Geek
D. Bang
解析:
string类的substr成员函数用于返回字符串的子串。它的原型为:
string substr (size_t pos = 0, size_t len = npos) const;
其中pos为要返回的子串的起始位置,len为子串的长度。
本题代码str.substr(2, 4)表示从str的第2个字符开始,截取长度为4的子串。
因为str的内容为"GeekBang",所以截取的子串为"ekBa",因此答案为B。
4. 执行下面C++代码后,输出是( )。
int x = 10;
x -= 3;
cout << x-- << endl;
A. 10
B. 7
C. 6
D. 3 
解析:
初始时x的值为10,执行x -= 3,x的值变为7。
接着执行cout << x-- << endl语句,这里用到了后置自减运算符。
后置自减的特点是先使用变量的值,然后再将变量的值减1。
因此这条语句会先输出x的当前值7,然后x的值再自减1变为6,但不影响本条语句的输出。
因此最终程序输出7,答案为B。
5. 执行下面C++代码后输出的是( )。
int a = 3;
int b = 4;
cout << (a^b) << endl;
A. 8 
B. 1
C. 12
D. 7
解析:
^运算符在C++中表示按位异或运算,即对两个整数的二进制形式进行异或操作,得到的仍是一个整数。
异或的规则是:相同为0,不同为1。
将a和b转换为二进制:
a = 3 = (011)2
b = 4 = (100)2
按位异或后的结果为:(111)2 = 7
因此最终输出7,答案为D。
6. 执行下面C++代码后输出的是( )。  
char str[] = "Geeky";  
cout << str[10] << endl;
A. 输出空格
B. 输出'\0' 
C. 输出'y'
D. 程序崩溃
解析:
本题定义了一个字符数组str,并用字符串常量初始化,初始化后的数组内容为:
str[0] == 'G'
str[1] == 'e'
str[2] == 'e'
str[3] == 'k'
str[4] == 'y'
str[5] == '\0'
数组str的有效下标为0~5,而题目中试图访问str[10],这已经越界了,属于非法内存访问,因此程序会崩溃。
所以本题的答案为选项D。
7. 下面C++代码执行后的输出是( )。
cout << 7/2.0 << endl;  
A. 3.5
B. 3
C. 4
D. 3.0
解析:
在C++,整数与浮点数运算的结果为浮点数。
对于除法运算/,如果两个操作数中有浮点数,结果就为浮点数。
72.0都是数字常量,其中7是整数,2.0是浮点数,因此7/2.0的结果就是浮点数3.5。
cout会按照浮点数的格式输出3.5,因此本题的答案为A。
8. 下面C++代码用于判断某个字符是否是字母,当输入为'H'时,横线上应填入的代码是( )。
char c;
cin >> c; 
if ( ________ )
   cout << "ALPHA" << endl;
else  
   cout << "NOT ALPHA" << endl;
A. c >= 65 && c <= 90
B. c >= 'A' && c <= 'Z'
C. c > 64 && c < 91  
D. c > 'A'&& c < 'Z'
解析:
在ASCII码表中,大写字母'A'~'Z'的编码为65~90,小写字母'a'~'z'的编码为97~122。
要判断一个字符c是否为字母,可以判断其ASCII码是否在'A'~'Z''a'~'z'的范围内。
本题只需要判断c是否为大写字母,因此可以使用条件c >= 'A' && c <= 'Z'。
虽然选项A和C在数值上与选项B等价,但直接使用字符形式更加直观,不易出错。
选项D的条件错误,无法判断字符'Z'。
因此本题的答案为选项B。
9. 64位计算机中,C++的整型变量long long的取值范围是( )。
A. -2^63 ~ 2^63-1
B. -2^31 ~ 2^31-1
C. 0 ~ 2^64-1
D. -2^32 ~ 2^32-1  
解析:
在64位计算机中,long long类型占用8个字节,64位。
对于有符号的long long类型,最高位为符号位,其余63位为数值位。
符号位为0表示正数,1表示负数。数值位采用补码形式存储。
因此long long的取值范围为:
最小值:-2^63 (-9223372036854775808)
最大值:2^63-1 (9223372036854775807)
选项B的范围对应32位整型,选项C的非负范围对应64位无符号整型,选项D的范围错误。
因此本题的答案为选项A。
10. 下面C++程序执行的结果是( )。
int i = 0;
do {
  ++i;  
} while (i < 5);
cout << i << endl; 
A. 4
B. 5
C. 6
D. 死循环
解析:
本题考查do-while循环的执行过程。
do-while循环的特点是先执行循环体,再判断循环条件,无论条件初始为真还是为假,循环体至少会执行一次。
本题中,变量i初始为0,进入循环后先自增1变为1,然后判断i < 5,条件为真,继续下一轮循环。
接着i再自增1变为2,判断i < 5,条件仍为真,继续下一轮循环。
依此类推,当i自增到5,条件i < 5变为假,循环结束,此时i的值为5。
因此最终程序输出5,答案为选项B。
11. C++的动态内存分配使用什么运算符( )。
A. malloc
B. alloc
C. new
D. create
解析:
在C++,使用new运算符进行动态内存分配。new运算符的基本用法为:
new 类型名T(初始化参数列表)
其中,类型名T可以是基本数据类型,也可以是类、结构、联合等用户自定义类型。
例如:
int* p = new int; //分配一个int型存储空间
int* arr = new int[10]; //分配10个int型连续存储空间
选项A的malloc是C语言的动态内存分配函数。
选项B和D是不存在的。
因此本题的答案为选项C。
12. 下面的C++代码的输出结果是( )。
int a = 10;
a += (a -= (a-=a)); 
cout << a << endl;
A. 10 
B. 20
C. 0
D. 30
解析:
这段代码考查了复合赋值运算符的用法和运算顺序。
1) a -= a 等价于 a = a - a,执行后a变为02) a -= 0 等价于 a = a - 0,执行后a仍为03) a += 0 等价于 a = a + 0,执行后a仍为0。
因此最终a的值为0,输出结果为0,答案是选项C。
需要注意这里的运算顺序是从右到左,先算a-=a,再算a-=0,最后算a+=0。
这是因为赋值运算符的结合性是从右到左的。
13. 以下C++代码输出的结果是( )。
for (int i = 10; i > 6; i -= 2) 
    cout << i << " ";
A. 10 8 6
B. 10 8  
C. 8 6
D. 10 8 6 4 2 0
解析:
本题考查for循环的执行过程。
for循环的一般形式为:
for (初始化语句; 循环条件; 更新语句) 
    循环体语句;
本题中,变量i初始为10,循环条件为i>6,每次循环将i减2。
第一次循环,i为10,满足i>6,输出i的值10,然后i减2变为8。
第二次循环,i为8,仍满足i>6,输出i的值8,然后i再减2变为6。 
第三次循环,i为6,不满足i>6,循环结束。
因此最终输出为10 8,选项B正确。注意循环结束时并不会输出i等于6的情况。
14. 计算机内部使用( )进制数。
A. 二进制
B. 八进制 
C. 十进制
D. 十六进制
解析:
现代计算机内部使用二进制数进行数据的存储和运算。
这是因为二进制只有01两种状态,可以用高低电平等简单物理量表示,便于电子电路的实现。
八进制、十进制和十六进制都是为了方便人类理解和记录而使用的,计算机内部并不直接使用它们。
程序员在编程时使用十进制、十六进制等形式,最终都要转换为二进制供计算机处理。
因此本题的答案为选项A。
15. 一个完整的计算机系统包括( )。
A. 硬件系统
B. 软件系统
C. 硬件系统和软件系统 
D. 以上都不对
解析:
计算机系统由硬件系统和软件系统两大部分组成。
硬件系统包括中央处理器、存储器、输入输出设备等物理部件,是计算机的躯体。
软件系统包括操作系统、支撑软件、应用软件等各种程序,是计算机的灵魂。
没有软件,计算机硬件就是一堆毫无生气的电子器件;没有硬件,软件就是一堆毫无用武之地的代码。
只有软件和硬件相互配合,计算机系统才能发挥作用。
因此本题的答案为选项C。选项A和B都只说对了一部分,选项D明显错误。

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

1. 执行C++代码 cout << (100 && 0) << endl; 输出结果为1。( )
解析:
&& 运算符表示逻辑与运算,其运算规则为:
- 如果两个操作数都为真(0),则结果为真(1)
- 如果至少有一个操作数为假(0),则结果为假(0) 
本题中 100 为真, 0 为假,因此 100 && 0 的结果为假,0。
因此该语句会输出 0 ,而不是 1。
本题的说法错误,括号中应填写 "错"
2. 在C++中,字符串比较可以直接使用><==等操作符。( )
解析:
在C++,字符串不能直接使用关系运算符和相等运算符进行比较。
这是因为在C++,字符串实际上是字符数组,数组名是指向数组首元素的指针。
如果对两个字符串使用>,<,==等操作符,实际上是在比较它们的地址,而不是内容。
要比较两个C风格字符串(字符数组)的内容,应该使用strcmp函数。例如:
char str1[] = "hello";
char str2[] = "world";
if (strcmp(str1, str2) < 0) {
    cout << "str1 is less than str2" << endl;
}
如果使用C++的string类,则可以直接使用>,<,==等操作符比较字符串内容。例如:
string str1 = "hello";
string str2 = "world";
if (str1 < str2) {
    cout << "str1 is less than str2" << endl;
}
因此,本题中的说法是错误的,括号中应填写 "错"
3. 执行C++代码 (2 || 0) && (3 && 1) 的结果为0。( )
解析:
根据逻辑运算符的运算规则,对于 && 运算,如果两个操作数都为真,则结果为真,否则为假。
对于 || 运算,如果至少一个操作数为真,则结果为真,否则为假。
在C++,0值都被视为真,只有0被视为假。
因此(2 || 0)的结果为1(),因为2是非0值。
(3 && 1)的结果也为1(),因为31都是非0值。
所以(2 || 0) && (3 && 1)相当于1 && 1,结果为1()。
本题中的说法是错误的,执行该表达式的结果为1而不是0,括号中应填写 "错"
4. 下面的C++代码会输出"HELLO"。( )
char str[10] = "HELLO";
str[1] = 'E';  
cout << str << endl;
解析:
这段代码定义了一个字符数组str,并用字符串常量"HELLO"初始化。
字符数组str的长度为10,初始化后的内容为:
str[0] == 'H'
str[1] == 'E'
str[2] == 'L'
str[3] == 'L'
str[4] == 'O'
str[5] == '\0'  //字符串以'\0'结尾
str[6]~str[9]未初始化,内容不确定
初始化后,str[1]'E',语句str[1] = 'E'将其重新赋值为'E',数组内容不变。 
最后输出str,会打印字符数组中从开头到'\0'之前的所有字符,"HELLO"。
因此本题中的说法是正确的,该代码会输出"HELLO",括号中应填写 "对"
5. 执行下面C++代码,会输出1 2 3 4 5。( )
int a[] = {1, 2, 3, 4, 5};
for (int i = 1; i <= 4; i++)  
    cout << a[i] << " "; 
解析:
这段代码定义了一个整型数组a,包含5个元素1~5。
数组下标从0开始,a[0]1,a[1]2,以此类推,a[4]5for循环从i=1开始,到i=4结束,循环体会执行4次。
在循环体中,每次输出a[i],然后输出一个空格。
具体过程为:
i=1,输出a[1],2
i=2,输出a[2],3 
i=3,输出a[3],4
i=4,输出a[4],5
最终的输出结果是:2 3 4 5
可以看到,数组的第一个元素1被漏掉了,因为循环是从下标1开始的。
如果要输出数组的所有元素,循环应该从下标0开始:
for (int i = 0; i < 5; i++)  
    cout << a[i] << " ";
因此本题中的说法是错误的,该代码不会输出1 2 3 4 5,而是2 3 4 5,括号中应填写 "错"
6. 下面的C++代码会发生除零错误。( )
int a = 0, b = 5;
cout << b/a << endl;
解析:
这段代码定义了两个整型变量a和b,并尝试计算b/a的结果。
变量a的值为0,而除数不能为0,否则会产生除零错误(也叫被零除异常)。
在数学中,任何数除以0都是没有意义的。在程序中,如果出现除零情况,程序会终止执行。
C++标准规定,如果整型变量除以0,程序的行为是未定义的。这意味着编译器可以自由选择如何处理这种情况,可能会报错,也可能会生成一个随机值。
但无论如何,这都是一种应该避免的错误情况。
因此本题中的说法是正确的,该代码会发生除零错误,括号中应填写 "对"
7. 执行下面C++代码会输出5。( ) 
int i = 0, s = 0;
do {
  s += ++i;
} while (i < 4);  
cout << s << endl;
解析:
这段代码使用do-while循环计算s的值。
do-while循环的特点是先执行循环体,再判断循环条件。无论条件是否满足,循环体至少会执行一次。
具体执行过程为:
1) 变量i和s初始化为02) 进入循环体,先将i加1,此时i变为1,然后将i的值加到s上,此时s变为13) 判断i < 4,条件为真,继续下一轮循环。
4) 再次进入循环体,i加1变为2,s加上i的值变为35) 判断i < 4,条件仍为真,继续下一轮循环。
6) 再次进入循环体,i加1变为3,s加上i的值变为67) 判断i < 4,条件仍为真,继续下一轮循环。
8) 再次进入循环体,i加1变为4,s加上i的值变为109) 判断i < 4,条件为假,循环结束。
10) 输出s的值,结果为10。
因此本题中的说法是错误的,该代码不会输出5,而是输出10,括号中应填写 "错"。
这里可能是出题人不小心写错了,把输出结果看成了循环的次数。
8. 执行下面C++代码,会输出1。( )
int x = 1;
switch(x) {
  case 1: cout<<"1"<<endl; 
  case 2: cout<<"2"<<endl; break;
  default: cout<<"d"<<endl; 
}  
解析:
这段代码使用switch语句根据x的值输出不同的结果。
switch语句会根据一个整型表达式的值,跳转到对应的case标签处执行。
如果没有匹配的case标签,就执行default标签后的语句(如果有的话)switch语句执行时,如果遇到break,就会跳出整个switch结构。
如果某个case后面没有break,就会继续执行下一个case,直到遇到break为止。这叫做case穿透。
本题中,x的值为1,因此会匹配case 1,输出"1"。
但是case 1后面没有break,所以会继续执行case 2,输出"2"case 2后面有break,此时会跳出switch结构,不会执行default。
因此该程序的输出结果是:
1
2
而不是只输出1。
本题中的说法是错误的,括号中应填写 "错"
9. Visual C++是一个C++的集成开发环境。( )
解析:
Visual C++是微软公司开发的一个C++集成开发环境(IDE)。
集成开发环境是一种软件开发工具,通常包含源代码编辑器、编译器、调试器和图形用户界面工具,旨在提高程序员的开发效率。
Visual C++提供了一个可视化的代码编辑环境,可以进行代码编写、编译、链接、调试、运行等一系列操作。
它与微软的其他开发工具如Visual Studio和Windows SDK集成,可以方便地开发Windows平台的应用程序。
Visual C++支持使用C++语言进行开发,并提供了对MFC、ATL、CLR等框架和库的支持。
除了Visual C++,其他常见的C++ IDE还有Dev-C++、Code::Blocks、Qt Creator、CLion等。
因此本题中的说法是正确的,Visual C++是一个用于C++开发的集成开发环境,括号中应填写 "对"
10. while循环和for循环可以完全等价地相互转换。( )
解析:
while循环和for循环都是C++的循环结构,用于重复执行某些语句。
它们在功能上是完全等价的,可以相互转换。
while循环的一般形式为:
while (循环条件) {
    循环体语句;
}
它的执行过程是:先判断循环条件,如果为真则执行循环体,然后再次判断循环条件,如此反复,直到循环条件为假时结束循环。
for循环的一般形式为:
for (初始化语句; 循环条件; 更新语句) {
    循环体语句;
}
它的执行过程是:先执行初始化语句,然后判断循环条件,如果为真则执行循环体,再执行更新语句,然后再次判断循环条件,如此反复,直到循环条件为假时结束循环。
任何一个for循环都可以改写成等价的while循环,例如:
for (int i = 0; i < n; i++) {
    cout << i << endl;
}
可以改写为:
int i = 0;
while (i < n) {
    cout << i << endl;
    i++;
}
反之,任何一个while循环也可以改写成等价的for循环,例如:
int i = 0;
while (i < n) {
    cout << i << endl;
    i++;
}
可以改写为:
for (int i = 0; i < n; i++) {
    cout << i << endl;
}
当然,并不是所有的while循环都必须改写成for循环,反之亦然。应该根据具体的需求和代码的可读性来选择合适的循环结构。
一般来说,如果循环次数已知,for循环更简洁;如果循环次数不确定,while循环更灵活。
因此本题中的说法是正确的,while循环和for循环可以完全等价地相互转换,括号中应填写 "对"

3.1 编程题1

试题名称:数列求和

问题描述:
给定一个正整数N,求以下数列的和:
1 + 1/2 + 1/3 + 1/4 ++ 1/N 
要求保留5位小数。

输入描述:
输入一个正整数N。其中 1 <= N <= 1000000。

输出描述:
输出数列的和,保留5位小数。

样例输入:
3

样例输出:
1.83333
参考答案:

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    int N;
    cin >> N;
    
    double sum = 0;
    for (int i = 1; i <= N; i++) {
        sum += 1.0 / i;
    }
    
    cout << fixed << setprecision(5) << sum << endl;
    
    return 0;
}
解析:
这是一道数列求和问题。根据题意,我们需要计算如下数列的和:
1 + 1/2 + 1/3 + 1/4 ++ 1/N
这个数列的通项公式为:a[i] = 1/i,其中i从1到N。
我们可以使用循环来计算这个数列的和,具体思路如下:
1. 定义一个双精度浮点型变量sum,初始值为0,用于存储数列的和。
2. 使用for循环遍历从1到N的每个数i,计算1/i的值并累加到sum中。
3. 输出sum的值,保留5位小数。
代码实现时需要注意以下几点:
1. 在C++,整数相除的结果仍为整数,小数部分会被截断。因此在计算1/i时,需要将分子或分母转换为浮点数,1.0/i或1/(double)i,这样才能得到正确的浮点数结果。
2. 在输出浮点数时,默认的输出格式是科学计数法,且默认精度为6位。为了按题目要求输出定点数和5位小数,需要使用fixed和setprecision(5)操作符。
3. 总的时间复杂度为O(N),空间复杂度为O(1)。当N很大时,循环的次数会很多,程序的执行时间会比较长。
当然,这个问题还有一些其他的解法,例如使用数学公式求解,或者使用其他的数值计算方法,可以达到更高的精度和更快的速度。
但对于本题而言,使用循环求和的方法已经足够了。

3.2 编程题2

试题名称:字符串压缩

问题描述:
给定一个字符串,请你将连续重复的字符压缩成"字符+连续出现次数"的形式。
如果某个字符连续出现少于2次,则保持原样不进行压缩。

输入描述:
一行字符串,字符串中只包含大小写英文字母,字符串长度不超过1000。

输出描述:
输出压缩后的字符串。

样例输入1:
aaaabcccaaa

样例输出1:
a4b1c3a3

样例输入2:
abcdef

样例输出2:
abcdef
参考答案:

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string a;
	cin>>a;
	int len = 1;
	for(int i=0; i<a.size(); i++)
	{
		if(a[i]==a[i+1])
		{
			len++;
		}
		else
		{
			if(len==1){
				cout<<a[i];
			}
			else{
				cout<<a[i]<<len;
			}
			len = 1;
		}
	}
	return 0;
 } 
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
GESP(Global Engineering Software Proficiency)是一种全球认可的工程软件能力认证标准,而Python则是一种高级编程语言。根据题目要求回答,以下是关于GESP Python三级认证试卷6月的一些说明。 GESP Python三级认证试卷是一种考核Python编程能力的专业认证试卷,在 6 月份进行。这个认证试卷旨在评估考生在使用Python语言和相关工具进行软件开发和解决问题方面的能力。 考试内容通常包括理论知识和实际编程题。理论部分可能包括Python语言的基础知识、面向对象编程、异常处理、模块和包管理、文件处理等方面的问题。考生需要能够准确回答这些问题,展示对Python语言的深入理解。 而实际编程题目则是考察考生在Python语言下解决问题的能力。这些题目可能涉及数据结构和算法、字符串处理、文件读写、数据库操作、网络编程等方面的内容。考生需要使用Python编写合适的代码,解决给定的问题。 GESP Python三级认证试卷的通过要求通常会根据不同考试中心的具体规定而有所不同。一般来说,考生需要在规定的时间内完成试卷,并达到一定的分数线才能获得认证。通过这个认证可以证明考生在Python编程方面具备较高的能力和经验,对于就业或者继续深入学习都有很大的帮助。 对于想要参加GESP Python三级认证试卷的考生来说,平时需要加强对Python语言的学习和实践,掌握相关的开发工具和库。还可以参加相关的培训课程和模拟考试,提前了解考试的要求和内容,这样可以更好地应对考试的挑战。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天秀信奥编程培训

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值