C++第15届10月STEMA
一、选择题
1. 十进制数189转换成二进制是( )。
A、10111101
B、11010011
C、11110000
D、11001100
答案:A
2. 定义一个整型变量int a,使用指针存储a的地址,下列选项正确的是( )
A、int &p = &a
B、int **p = &a
C、int *p = a
D、int *p = &a
答案:D
3. 定义一个字符串数组:char a[1024] = “Welcome to China!”;要计算上述字符串的长度,应该使用下列哪个函数( )。
A、strcat()
B、strcmp()
C、strlen()
D、size()
答案:C
4. 已定义变量int a = 10, b = 0;执行表达式((a = 5) || (b = 1))之后,a和b的值分别是( )。
A、10 0
B、5 1
C、5 0
D、10 1
答案:C
5. 运行下面程序,输出的结果是( )。
int func(int x, int y)
{
if(x == 1 && y == 1)
return 1;
if(x < 0)
return y;
if(y < 0)
return x;
return (func(x, y-2) + func(x-2, y));
}
int main()
{
cout << func(3,3);
return 0;
}
A、7
B、8
C、9
D、10
答案:C
解析:
1. 调用 func(3,3) 会得到 func(3,1) + func(1,3)
2. 继续func(3,1)。y-2之后会小于 0,所以返回 x,也就是3。
3. 继续func(1,3)。下一步会得到func(1,1) + func(-1,3)。
① 对于 func(1,1), 因为 x 和 y 都等于 1,然后就会返回 1。
② 对于 func(-1,3),因为 x 小于 0,所以返回 y,也就是 3。
二、编程题
1. 与3有关的数
提示信息:
如果一个正整数的个位可以被3整除,则这个正整数与3有关。
例如:
10的个位是0,0能被3整除,故10与3有关;
11的个位是1,1不能被3整除,故11与3无关;
19的个位是9,9能被3整除,故19与3有关。
题目描述:
给定一个正整数N(1≤N≤10000),从小到大依次输出1到N之间所有与3有关的数
输入描述: 输入一个正整数N(1≤N≤10000)
输出描述: 输出一行,表示1到N之间(含1和N)所有与3有关的正整数,从小到大排列,正整数之间以一个空格隔开
样例输入: 10
样例输出: 3 6 9 10
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,b;
cin >> n;
for(int i=1;i<=n;i++){
b=i%10;
if(b%3==0){
cout<<i<<" ";
}
}
return 0;
}
2. 跳水比赛
题目描述:
某校有N名选手参加跳水比赛。每名选手比赛后,由6名裁判评分,选手的最终得分为6名裁判评分的总和。
比赛结束之后,请计算出最高分与最低分相差多少。
例如:N = 4,表示有4名选手;
裁判对于这4名选手的打分是:
5 9 6 8 7 6
7 7 7 8 6 7
5 7 6 7 5 7
7 7 7 5 9 8
4名选手的最终分数分别为:41,42,37,43,其中最高分是43分,最低分是37分,那么最高分和最低分相差了6分,故输出6。
输入描述:
第一行输入一个正整数N(2≤N≤100),表示参赛选手的人数
接下来输入N行,每行6个整数(0≤整数≤10),表示每个裁判的评分,整数之间以一个空格隔开
输出描述:
输出一个整数,表示最高分与最低分的差值
样例输入:
4
5 9 6 8 7 6
7 7 7 8 6 7
5 7 6 7 5 7
7 7 7 5 9 8
样例输出:
6
#include<bits/stdc++.h>
using namespace std;
int a[101][101],b[101];
int main(){
int n=0,max=-999,min=999;
cin >> n;
for(int i=1;i<=n;i++){
for(int j=1;j<=6;j++){
cin>>a[i][j];
b[i]+=a[i][j];
}
}
for(int i=1;i<=n;i++){
if(b[i] > max) max=b[i];
if(b[i]<min) min=b[i];
}
cout<<max-min;
return 0;
}
3. 密文解密
题目描述:
有一段密文,加密规律如下:
原文中所有的字符在字母表中的位置被左移了若干位(如:a左移一位后为z,A左移一位后为Z,f左移三位后为c…)。
例如:密文为Ayz,已知加密时原文中的字母被左移了3位,解密后,原文是Dbc。
请根据这个规律,对密文进行解密。
输入描述:
共两行
第一行输入一个只包含大小写字母的字符串(长度小于100),表示密文
第二行输入一个正整数n(1≤n≤100000),表示原文中的字母在字母表中的位置被左移的位数
输出描述:
输出一个字符串,表示解密后的原文
样例输入:
Ayz
3
样例输出:
Dbc
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
int n,num,x;
cin >> s >> n;
for(int i=0;i<s.size();i++){
num=int(s[i]);
if(num>=65 && num<=90){
if(num+n<=90){
s[i] = char(num+n);
}else{
cout<<num+n<<endl;
s[i] = char(num+n-91+65);
}
}else{
if(num+n<=122){
s[i] = char(num+n);
}else{
s[i] = char(num+n-123+97);
}
}
}
cout<<s;
return 0;
}
4. 翻转游戏币
题目描述:
桌面上有n枚游戏币,均为反面朝上,编号依次为1到n。有n个人(游戏币的数量与人的数量相等),首先第1个人将所有游戏币翻转,然后第2个人将所有编号是2的倍数的游戏币翻转,接下来第3个人将所有编号是3的倍数的游戏币翻转…以此类推,当最后一个人完成操作后,还有多少枚游戏币正面朝上?
例如:n = 4;
最初4枚游戏币的状态为:反反反反;
经过第1个人翻转后,游戏币的状态为:正正正正;
经过第2个人翻转后,游戏币的状态为:正反正反;
经过第3个人翻转后,游戏币的状态为:正反反反;
经过第4个人翻转后,游戏币的状态为:正反反正;
最后,还有两枚游戏币正面朝上,故答案为2。
输入描述:
输入一个正整数n(3≤n≤109),表示游戏币数量及人的数量
输出描述:
输出一个整数,表示最终游戏币正面朝上的数量
样例输入:
4
样例输出:
2
#include<bits/stdc++.h>
using namespace std;
int a[101]={0};
int main(){
int n,cnt=0;
cin >> n;
for(int i=1;i<=n;i++){ // 从第一个人开始
for(int j=1;j<=n;j++){ // n枚硬币
if(j % i == 0){
a[j] = !a[j];
}
}
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
if(a[i] > 0){
cnt++;
}
}
cout<<endl<<cnt;
return 0;
}
5. 分发糖果
题目描述:
n个学生站成一排,已知每名学生的考试成绩,老师要根据成绩按以下规则分发糖果:
1、每个学生至少得到一个糖果;
2、相邻两个学生中成绩高的会获得更多的糖果;
3、相邻两个学生成绩即使相同,获得的糖果数量也可以不同。
请计算出老师最少需要准备多少颗糖果?
例如:有3个学生,他们的考试成绩分别是70,50,80,可以给第一个学生2颗糖果,给第二个学生1颗糖果,给第三个学生2颗糖果,所以最少需要准备5颗糖果。
输入描述:
共两行
第一行输入一个正整数n(1≤n≤20000),表示学生人数
第二行输入n个整数(0≤整数≤100),表示每个学生的考试成绩,整数之间以一个空格隔开
输出描述:
输出一个整数,表示最少需要准备的糖果数量
样例输入:
3
70 50 80
样例输出:
5
#include<bits/stdc++.h>
using namespace std;
int n, candy[100],a[101]; //candy:糖果数量 a:成绩
int main() {
// 1、 输入数据
cin >> n;
for (int i = 0; i < n; i++) {
candy[i]=1; //初始默认每个小朋友得到的糖果数量为1
cin >> a[i];
}
//2、从前向后(右边的和左边的成绩比较)
for (int i = 1; i < n; i++) {
if (a[i] > a[i - 1])
candy[i] = candy[i - 1] + 1;
}
//3、 从后向前(左边的和右边成绩比较)
for (int i = n - 2; i >= 0; i--) {
if (a[i] > a[i + 1] ) {
candy[i] = max(candy[i], candy[i + 1] + 1);
}
}
//4、 需要准备的糖果数量
int s = 0;
for (int i = 0; i < n; i++)
s +=candy[i];
cout<<s;
return 0;
}
5. 区间最小值
题目描述:
给定n个整数,从1到n顺序编号,接下来进行m次查询,第i次查询第ai个数到第bi个数(包含ai和bi)之间的最小值并输出。
例如:n = 8, 8个正整数依次为:40 20 10 30 70 50 80 60
m = 3,3次查询分别为:
a1 = 3, b1 = 7
a2 = 1, b2 = 2
a3 = 5, b3 = 8
第一次查询:第3个数(10)到第7个数(80)之间最小值是10;
第二次查询:第1个数(40)到第2个数(20)之间最小值是20;
第三次查询:第5个数(70)到第8个数(60)之间最小值是50;
故输出
10
20
50。
输入描述:
第一行输入两个整数n和m(1≤n,m≤10
5),分别表示整数的数量及查询次数
第二行输入n个整数(0≤整数≤105)
接下来m行,每行输入2个整数ai和bi(1≤ai≤bi≤n),分别表示查询的起始位置和终止位置
输出描述:
输出共m行,每行输出一个整数,分别表示每次查询得到的第ai个数到第bi个数之间(包含ai和bi)的最小值
样例输入:
8 3
40 20 10 30 70 50 80 60
3 7
1 2
5 8
样例输出:
10
20
50
#include<bits/stdc++.h>
using namespace std;
int a[101],b[101],c[101],n,m;
int main(){
// 1、输入数据
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i]>>c[i];
// 2. 开始查找数据
for(int i=1;i<=m;i++){
int min=9999;
for(int j=b[i];j<=c[i];j++){
if(a[j]<min){
min=a[j];
}
}
cout<<min<<endl;
}
return 0;
}