选择题
第⼀题(单选题)
下列符号中哪个在
C++
中表⽰⾏注释
()
。
A. !
B. #
C. ]
D. //
解析
:
D
C++
注释的编写⽅法如下:
/*
(斜线、星号)字符,后跟任意字符序列(包括新⾏),然后是
*/
字符。 此语法与
ANSI C
相同。
//
(两个斜杠)字符,后跟任意字符序列。 没有紧跟反斜杠的新⾏将终⽌这种形式的注释。 因此,它通
常称为
“
单⾏注释
”
。
第⼆题(单选题)
每个
C++
程序都必须有且仅有⼀个
()
A.
函数
B.
预处理命令
C.
主函数
D.
语句
解析:
C
C++
中主函数只有⼀个。
第三题(单选题)
下列字特串中不可以⽤作
C++
变量名称的是
( )
A. str123
B. int
C._9999
D.name
解析:
B
以下为
C++
必须遵守的变量命名规则:
第
12
届蓝桥杯省赛解析
.md
3/9/2023
2 / 7
1
、
变量名只能是字⺟(
A-Z
,
a-z
)和数字(
0-9
)或者下划线(
_
)组成。
2
、
第⼀个字⺟必须是字⺟或者下划线开头。
3
、
不能使⽤
C++
关键字来命名变量,以免冲突。
4
、
变量名区分⼤⼩写。
第四题(单选题)
⼆进制加法
10010100+110010
的和为
( )
A. 11000110
B. 10100110
C. 10110110
D. 11100110
解析:
A
⼆进制数的加法根据
“
逢⼆进⼀
”
规则,
⼆进制数加法的法则为:
0
+
0
=
0
0
+
1
=
1
1
+
0
=
1
1
+
1
=
10
(进位为
1
)
第五题(单选题)
对于
int *pa[5];
的描述中,正确的是
()
。
第
12
届蓝桥杯省赛解析
.md
3/9/2023
3 / 7
A.pa
是⼀个指向数组的指针,所指向的数组是
5
个
int
型元素
B.pa
是⼀个指向某数组中第
5
个元素的指针,该元素是
int
型变量
C.pa[5]
表⽰数组的第
5
个元素的值,是
int
型的值
D.pa
是⼀个具有
5
个元素的指针数组,每个元素是⼀个
int
型指针
解析:
D
int *pa[5]:
定义了⼀个名为
pa
的数组,该数组有
5
个元素,每个元素都是⼀个指针,指针指向整形变量。
编程题
1
、
字符串
给定一个字符串,然后将字符串倒序输出。
输入一个字符串S(2<S长度<100)。
将字符串S倒序输出。
输入数据 1
abc
Copy
输出数据 1
cba
【解析】本题考查的是字符串的基本知识。
#include <iostream>
#include <string>
using namespace
std
;
int
main
()
{
string
s;
cin
>> s;
for
(
int
i = s.length()
-1
; i >=
0
; i--)
{
cout
<< s[i];
}
cout
<<
endl
;
return
0
;
}
2
、剪绳⼦
题目描述
一条绳子从中间剪一刀可以剪成两段绳子;如果对折1次,中间剪一刀可以剪出3段绳子;如果连续对折2次,中间剪一刀可以剪出5段绳子;那么,连续对折n次,中间剪一刀可以剪出多少段绳子?
通过编写程序,在给定绳子对折次数,计算出中间剪一刀后可剪出绳子的段数。
输入格式
输入一个正整数 n(2<n<20)作为绳子对折的次数
输出格式
输出一个正整数,表示对折n次后的绳子中间剪一刀可以剪出绳子的段数
输入数据 1
2
Copy
输出数据 1
5
【解析】
编程计算即可
#include <iostream>
using namespace
std
;
int
main
()
{
int
n;
cin
>> n;
int
ans =
1
;
for
(
int
i =
1
; i <= n; i++)
{
ans *=
2
;
}
ans +=
1
;
cout
<< ans <<
endl
;
return
0
;
}
3
、合数求和
【解析】
本题考查质合判断,枚举
4~n
中所有的合数,求和即可。
#include <iostream>
using namespace
std
;
//
求质数
bool
isPrime
(
int
x)
{
if
(x <
2
)
return
false
;
for
(
int
i =
2
; i * i <= x; i++)
{
if
(x % i ==
0
)
return
false
;
}
return
true
;
}
int
main
()
{
int
n;
cin
>> n;
int
sum =
0
;
for
(
int
i =
4
; i <= n; i++)
{
if
(!isPrime(i))
//
如果是质数,累加到
sum
中
{
sum += i;
}
cout
<< sum <<
endl
;
return
0
;
}
4
、求和比较
【解析】
本题属于计数型动态规划问题,我们可以定义出状态
dp[i][j]
表⽰
1~i
的数字拆分成两个⼦数组求和的差的绝对值
为
j
的⽅案数。
答案需要特判
m == 0
时的情况,例如
n=3, m=0
时,只有⼀组
A1={1, 2}, A2={3}
,但使⽤
dp
会将正反计算两次,
因此需要对结果除以
2
;
其他情况下,不会出现正反计算两次的情况,因此直接输出即可。
#include <iostream>
#include <algorithm>
using namespace
std
;
int
dp[
35
][
550
];
int
main
()
{
int
n, m;
cin
>> n >> m;
int
sum =
0
;
dp[
0
][
0
] =
1
;
for
(
int
i =
1
; i <= n; i++)
{
for
(
int
j =
0
; j <= (i+
1
)*i/
2
; j++)
{
//dp[i][j]
表⽰
1~i
的数字拆分成两个⼦数组求和的差的绝对值为
j
的⽅案数。
dp[i][j] = dp[i
-1
][j+i] + dp[i
-1
][
abs
(j-i)];
}
}
if
(m ==
0
)
cout
<< dp[n][m] /
2
<<
endl
;
else
cout
<< dp[n][m] <<
endl
;
return
0
;
5
、最⼤价值
【解析】
本题为
01
背包问题,属于模板题。
#include <iostream>
#include <algorithm>
using namespace
std
;
int
w[
55
], v[
55
];
int
dp[
55
][
605
];
int
main
()
{
int
t, m;
cin
>> t >> m;
for
(
int
i =
1
; i <= m; i++)
{
cin
>> w[i] >> v[i];
for
(
int
i =
1
; i <= m; i++)
{
for
(
int
j =
1
; j <= t; j++)
{
if
(j >= w[i])
dp[i][j] =
max
(dp[i
-1
][j], dp[i
-1
][j-w[i]]+v[i]);
else
dp[i][j] = dp[i
-1
][j];
}
}
cout
<< dp[m][t] <<
endl
;
return
0
;
}