中国电子学会2023年05月份青少年软件编程C++等级考试试卷二级真题(含答案)

中国电子学会2023年05月份青少年软件编程C++等级考试试卷二级真题(含答案)_第1张图片

一、编程题(共5题,共100分)

1. 数字放大

给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。
时间限制:1000
内存限制:65536
【输入】
包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整型范围),为指定的整数x。

【输出】
N个整数,为原序列放大之后的序列,整数之间以一个空格分开。

【样例输入】

3
1 5 7
2

【样例输出】

2 10 14

提示: 注意答案的数据范围

参考答案

#include
using namespace std;
long long a[105];
int main(){
  long long n , x;
  cin >> n;
  for(int i = 0;i < n;i++){
    cin >> a[i];
  }
  cin >> x;
  for(int i = 0;i < n;i++){
    cout << a[i] * x << " ";
  }
  return 0;
}

2. 单词倒排

编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
时间限制:10000
内存限制:65536
【输入】

输入为一个字符串(字符串长度至多为100)。
【输出】
输出为按要求排序后的字符串。

【样例输入】

I am a student

【样例输出】

student a am I

参考答案

#include
using namespace std;
string s[100005];
int main(){
	int n = 0;
	while(cin >> s[n]){
		n++;
	}
	for(int i = n - 1;i >= 0;i--){
		cout << s[i] << " ";
	}
	return 0;
}

3. 计算矩阵边缘元素之和

所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
时间限制:10000
内存限制:65536
【输入】

第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。 接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。

【输出】

输出对应矩阵的边缘元素和

【样例输入】

3 3
3 4 1
3 7 1
2 0 1

【样例输出】

15

参考答案

#include
using namespace std;
int a[105][105];
int main(){
	int n , m , sum = 0;
	cin >> n >> m;
	for(int i = 0;i < n;i++){
		for(int j=0;j<m;j++){
			cin >> a[i][j];
		}
	}
	for(int i = 0;i < n;i++){
		for(int j = 0;j < m;j++){
			if(i == 0 || i == n - 1 || j == 0 || j == m - 1){
				sum = sum + a[i][j];
			}
		}
	}
	cout << sum;
	return 0;
}

4. 奇数单增序列

给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。
时间限制:1000
内存限制:65536
【输入】

共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。

【输出】

增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。

【样例输入】

10
1 3 2 6 5 4 9 8 7 10

【样例输出】

1,3,5,7,9

参考答案

#include
using namespace std;
int a[505];
int main(){
	int n;
	int ans = 0;
	cin >> n;
	for(int i = 0;i < n;i++){
		cin >> a[i];
	}
	sort(a + 0 , a + n);
	for(int i = 0;i < n;i++){
		if(a[i] % 2 != 0){
			if(ans == 1){
				cout<<",";
			}
			cout << a[i];
			ans = 1;
		}
	}
	return 0;
}

5. 实数加法

求两个实数相加的和。

题目中输入输出里出现的浮点数都有如下的形式: P1P2…Pi.Q1Q2…Qj。对于整数部分,P1P2…Pi是一个非负整数且当整数部分不为0时,P1不等于0;对于小数部分,Qj不等于0。
时间限制:1000
内存限制:65536
【输入】

2行,每行是一个加数。每个加数的长度不超过100。

【输出】

一行,即相应的和。输出保证一定是一个小数部分不为0的实数。

【样例输入】

0.111111111111111111111111111111
0.111111111111111111111111111111

【样例输出】

0.222222222222222222222222222222

参考答案

#include
#include
#include
using namespace std;
int main()
{
    char a[202],b[202],c[101],d[101];
    cin>>a;
    cin>>b;
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));
    int i,j=0,ap=0,bp=0,ka=0,kb=0;
    //ka,kb用来统计数组a和b的小数部分的位数
    //ap,bp用来统计数组a和b的整数部分的位数
 
    //统计数组a的整数部分和小数部分的位数
    for(i=0; i<strlen(a); i++)
    {
        if(a[i]=='.')
        {
            break;
        }
        ap++;
    }
    ka=strlen(a)-ap-1;
    //统计数组b的整数部分和小数部分的位数
    for(i=0; i<strlen(b); i++)
    {
        if(b[i]=='.')
        {
            break;
        }
        bp++;
    }
    kb=strlen(b)-bp-1;
    //对于整数部分从个位开始加即倒叙输入
    for(i=0; i<ap||i<bp; i++)
    {
        if(i<ap)
        {
            c[i]+=a[ap-1-i]-'0';
        }
        if(i<bp)
        {
            c[i]+=b[bp-1-i]-'0';
        }
        if(c[i]>9) //大于9则向前进1
        {
            c[i+1]+=1;
            c[i]%=10;
        }
    }
    //判断是否有小数部分
    if(ka>0||kb>0)
    {
        for(i=0; i<ka||i<kb; i++)
        {
            if(i<ka)
            {
                d[i]+=a[i+ap+1]-'0';//小数部分正序输入
            }
            if(i<kb)
            {
                d[i]+=b[i+bp+1]-'0';
            }
        }
        //取两者最大小数位,用于输出小数输出
        if(ka<kb)
        {
            ka=kb;
        }
        //取两者最大整数位
        if(ap<bp)
        {
            ap=bp;
        }
        for(i=ka-1; i>0; i--) //向前进1
        {
            if(d[i]>9)//小数部分的进位
            {
                d[i-1]+=1;
                d[i]%=10;
            }
        }
        if(d[0]>9)//对第一位小数是否进位进行判断
        {
            c[0]+=1;
            d[0]%=10;
            while(c[j]>9)
            {
                c[j+1]+=1;
                c[j]%=10;
            }
        }
        if(c[ap]>0)
        {
            printf("%d",c[ap]);
        }
        for(i=ap-1; i>=0; i--)
        {
            printf("%d",c[i]);
        }
        printf(".");
        for(i=0; i<ka; i++)
        {
            printf("%d",d[i]);
        }
    }
    else
    {
        if(ap<bp)
        {
            ap=bp;
        }
        if(c[ap]>0)
        {
            printf("%d",c[ap]);
        }
        for(i=ap-1; i>=0; i--)
        {
            printf("%d",c[i]);
        }
    }
    return 0;
}

你可能感兴趣的:(电子学会C++真题,c++,开发语言,青少年编程,算法)