题目
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++中,整数与浮点数运算的结果为浮点数。
对于除法运算/,如果两个操作数中有浮点数,结果就为浮点数。
7和2.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变为0。
2) a -= 0 等价于 a = a - 0,执行后a仍为0。
3) 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. 十六进制
解析:
现代计算机内部使用二进制数进行数据的存储和运算。
这是因为二进制只有0和1两种状态,可以用高低电平等简单物理量表示,便于电子电路的实现。
八进制、十进制和十六进制都是为了方便人类理解和记录而使用的,计算机内部并不直接使用它们。
程序员在编程时使用十进制、十六进制等形式,最终都要转换为二进制供计算机处理。
因此本题的答案为选项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(真),因为3和1都是非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]为5。
for循环从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初始化为0。
2) 进入循环体,先将i加1,此时i变为1,然后将i的值加到s上,此时s变为1。
3) 判断i < 4,条件为真,继续下一轮循环。
4) 再次进入循环体,i加1变为2,s加上i的值变为3。
5) 判断i < 4,条件仍为真,继续下一轮循环。
6) 再次进入循环体,i加1变为3,s加上i的值变为6。
7) 判断i < 4,条件仍为真,继续下一轮循环。
8) 再次进入循环体,i加1变为4,s加上i的值变为10。
9) 判断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;
}