2023年第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,也就是33. 继续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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1024节

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

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

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

打赏作者

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

抵扣说明:

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

余额充值