2023年第15届12月STEMA

一、选择题

1. 定义字符串 string a = “Hello C++”,下列选项可以获取到字符 ‘C’ 的是( )。

A.a[7]
B.a[6]
C.a[5]
D.a[4]

答案:B

2. 下列选项中数值与其它项不同的是( )。

A.(1234)5
B.(302)8
C.(11000100)2
D.(c2)16
答案:C

3. 定义变量 int i = 0, a,执行表达式 a = --i 后,i 和 a 的值分别是( )。

A.-1、0
B.0、-1
C.-1、-1
D.0、0
答案:C

4. 定义数组 int a[10] = {4, 6, 1, 3, 8, 7, 2, 9, 0, 5},那么 *(a + 5) 的值是( )。

A.7
B.8
C.2
D.9
答案:A

5. 执行以下程序,输出的结果是( )。

int func( int x, int y, int z )
{
    if( x == 1 || y == 1 || z == 1 ) return 1;
    if( x < y && x < z )
        return func( x, y - 1, z ) + func( x, y, z - 1 ); 
    if( y < x && y < z )
        return func( x - 1, y, z ) + func( x, y, z - 1 );
    return func( x - 1, y, z ) + func( x, y - 1, z );
}
int main()
{
    cout << func( 3, 3, 2 );
    return 0;
}

A.5
B.6
C.7
D.8
答案:B

二、编程题

1. 求和

题目描述:
给定 n 个整数,请计算出所有大于等于 10 的整数之和。
例如:n = 5,5 个整数分别为 10、20、4、30、9,其中大于等于 10 的整数有 10、20、30,它们的和为 60(10 + 20 + 30)。
输入描述:
共两行
第一行输入一个整数 n(1≤n≤1000)
第二行输入 n 个整数 Pi(1≤Pi≤100),整数之间以一个空格隔开输出描述:输出一个整数,表示所有大于等于 10 的整数之和
样例输入:
5
10 20 4 30 9
样例输出:
60

#include <bits/stdc++.h>
using namespace std;
int main() {
  int n, s = 0;
  cin >> n;
  for (int i = 1, x; i <= n; i++) {
    cin >> x;
    if (x >= 10)
      s += x;
  }
  cout << s;
  return 0;
}

2. 数位和为偶数的数

提示信息:
偶数:能被 2 整除的数。
数位和:一个整数中所有数位上的数字之和。
例如:整数 123,数位和是 6(1 + 2 + 3)。

题目描述:
给定一个整数 n,请找出 1 到 n 之间(包含 1 和 n)所有数位和为偶数的整数。
例如:n = 15,1 到 15 之间的整数为:1、2、3、4、5、6、7、8、9、10、11、12、13、14、15;数位和依次为:1、2、3、4、5、6、7、8、9、1、2、3、4、5、6;
数位和为偶数的是:2、4、6、8、11、13、15。

输入描述:
输入一个整数 n(2≤n≤1000)

输出描述:
一行输出若干个整数,表示 1 到 n 之间(包含 1 和 n)所有数位和为偶数的数,并按照从小到大的顺序依次输出,整数之间以一个空格隔开

样例输入:
15

样例输出:
2 4 6 8 11 13 15

#include <bits/stdc++.h>
using namespace std;
int main() {
  int n;
  cin >> n;
  for (int i = 1, x, y; i <= n; i++) {
    x = i;
    y = 0;
    while (x) {
      y += x % 10;
      x /= 10;
    }
    if (y % 2 == 0)
      cout << i << " ";
  }
  return 0;
}

3. 填涂颜色

题目描述:
给定一个由 n 行 m 列的小方格组成的矩阵图形,接下来对该图形进行如下操作:1、先选择其中 x 行,将其填成黄色;2、再选择其中 y 列,将其填成黄色;填色完成后,请统计出有多少个小方格未被填色。

例如:矩阵图形由 4 行 5 列的小方格组成,先选择第 2、4 行将其填色,再选择第 1、3、5 列将其填色。

填色完成后,有 4 个小方格未被填色。
输入描述:
共三行
第一行输入 4 个整数 n,m,x,y,分别表示矩阵的行数和列数以及选择填色的行数和列数 (1≤x≤n≤10000,1≤y≤m≤10000),整数之间以一个空格隔开
第二行输入 x 个不同的整数(1≤整数≤n),表示被填色的行号,整数之间以一个空格隔开
第三行输入 y 个不同的整数(1≤整数≤m),表示被填色的列号,整数之间以一个空格隔开
输出描述:
输出一个整数,表示填色完成后未被填色的小方格数量

样例输入:
4 5 2 3
2 4
1 3 5

样例输出:
4

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n,m,x,y,a[10001];
	
	cin >> n >> m >> x >> y;
	
	for(int i=1;i<=x;i++) cin >> a[i];
	for(int i=1;i<=y;i++) cin >> a[i];	
	
	cout<<n*m-x*m-y*n+x*y;

  return 0;
}
#include <bits/stdc++.h>
using namespace std;

int arr[101][101]={0};
int main() {
	// 1、输入数据。
	//  n行、m列、填充x行、填充y行、a用于循环输入行数或列数 
	int n,m,x,y,a,cnt=0;
	
	cin >> n >> m >> x >> y;
	// 2、填充行 
	for(int i=1;i<=x;i++){
		cin >> a;
		for(int j=0;j<m;j++){
			arr[a-1][j]=1;
		}
	}
	// 3、填充列		
	for(int i=1;i<=y;i++){
		cin >> a;
		for(int j=0;j<m;j++){
			arr[j][a-1]=1;
		}
	}	
	// 4、计算数量 
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(arr[i][j] == 0){
				cnt++; 
			}
		}
	}
	cout<<endl<<cnt<<endl;
  return 0;
}

4. 外观数列

提示信息:

外观数列是一个整数序列,给定该数列的第一项数据之后,从第二项开始,每一项都是对前一项数据的描述。

例如:

给定外观数列的第一项为 1;

接下来第二项是对第一项数据的描述,即“一个 1”,记作 11;

第三项是对第二项数据的描述,即“两个 1”,记作 21;

第四项是对第三项数据的描述,即“一个 2,一个 1”,记作 1211;

第五项是对第四项数据的描述,即“一个 1,一个 2,两个 1”,记作 111221;以此类推…

题目描述:

给定外观数列的第一项 x 以及一个整数 n,请计算出该外观数列第 n 项的值。

例如:x = 2,n = 3,外观数列为:

2

12

1112

3112

132112

外观数列第 3 项为 1112。

输入描述:

输入两个整数 x(1≤x≤100)和 n(1≤n≤30)

输出描述:

输出一个整数,表示外观数列第 n 项的值

样例输入:

2 3

样例输出:

1112

#include <bits/stdc++.h>
using namespace std;

int main() {
	string s,new_s;
	int n,cnt;
	
	cin >> s >> n;
	
	for(int i=2;i<=n;i++){
		cnt=1;
		new_s.clear();
		for(int j=0;j<s.size();j++){
			if(s[j]==s[j+1]){
				cnt++;
			}else{
				new_s += cnt+'0';
				new_s += s[j];
				cnt=1;
			}
		}
		s=new_s;
	}
	cout<<s<<endl;

  return 0;
}

5. 删除数字

题目描述:

老师在黑板上写了一个不超过 500 位的正整数 n(1≤n<10500),要求同学们删除其中任意 k 个数字, 剩余数字的顺序不变,希望得到的数最大。

例如:n = 69134,k = 2,从 69134 中删除 2 个数字,将第一位 6 和第三位 1 删除,得到的新数 934 是最大的。

输入描述:

输入两个整数 n 和 k(1≤n<10500,0≤k<n的位数),整数之间以一个空格隔开

输出描述:

输出一个整数,表示删除 k 个数字后,得到的最大数

样例输入:

69134 2

样例输出:

934

#include <bits/stdc++.h>
using namespace std;

int main(){	 
	string n;
	int k;
	
	cin >> n >> k;
	
	for(int i=1;i<=k;i++){ 			// 遍历K次,要删除K个数字
		int flag=1;
		for(int j=1;j<n.size();j++){ // 从第2个数字开始比,如果这个数字 小于 后面的数字,那么删除这个小的数字 
			if(n[j-1] < n[j]){
				n.erase(j-1,1);
				flag=0;
				break;
			} 
		} 
		if(flag){					// 如果一直到最后一个数字都是当前数字 大于 后面的数字,那么删除最后一个数字 
			n.erase(n.size()-1,1);
		}
	}
	cout<<n;

	return 0;
} 
#include <bits/stdc++.h>
using namespace std;

int main() {
	string s;
	int k;
	
	cin >> s >> k;
	
	s+='9';
	for(int i=1;i<=k;i++){ 				// 要删除K个数字,重复执行k次 
		for(int j=0;j<s.size();j++){	// 从头开始遍历,遍历k次 
			if(s[j]<s[j+1]){			// 如果当前这个数字 小于 它后面的数字,则删除,并结束循环 
				s.erase(j,1);
				break;
			}
		} 
	}
	s.erase(s.size()-1,1);
 	cout<<s;

	return 0;
}
  • 20
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1024节

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

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

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

打赏作者

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

抵扣说明:

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

余额充值