2021年6月青少年C/C++软件编程(二级)等级考试试卷及答案解析

目录

T1 数字放大

T2统一文件名

T3内部元素之和

T4整数排序

T5计算好数

T1 数字放大

给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。

时间限制:1000    内存限制:65536

输入

包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格分开; 第三行包含一个整数(不超过整型范围),为指定的整数x。

输出

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

样例输入

3

1 5 7

2

样例输出

2 10 14

提示

注意答案的数据范围

解析

此题考查数组及循环使用,提示注意数据范围,乘数被乘数都为整型范围,那么乘法结果应该为长整型范围内,所以数组定义使用long long类型定义即可。

#include
using namespace std;
long long a[105]; //使用long long 定义数组,避免结果超限
int main()
{
    int n,x;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    cin>>x;
    for (int i=1;i<=n;i++)
    {
    	a[i]*=x;
    	cout<

T2统一文件名

小A在命名文件的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将目录下的文件统一规范的格式,即文件名的第一个字符如果是字母要大写,其他字母小写。如将Test、test整理成Test。

时间限制:1000    内存限制:65536

输入

第一行一个数字n,表示有n个文件名要统一,n不超过100。 接下来n行,每行一个单词,长度不超过20,表示文件的名字。文件名由字母、数字和-组成。

输出

n行,每行一个单词,对应统一后的文件名。

样例输入

4

Test

data

2-TEST

problem-6

样例输出

Test

Data

2-test

Problem-6

解析 

此题考查字符串处理,字符ASCII码相关知识,对于每个输入进来的书名,首先判断首个字符是不是小写字母,是的话变成大写字母,数字或大写字母不变(忽略),然后使用循环对其他字母逐一判断,如果是大写字母,改成小写字母,数字或小写字母不变(忽略),然后输出处理过的字符串即可。

#include
using namespace std;
int n;
string s;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
		cin>>s;
		if (s[0]>='a'&&s[0]<='z')//处理首字母,如果是小写字母改成大写
		{
			s[0]+='A'-'a';
		}
        int len=s.length();
		for (int j=1;j='A'&&s[j]<='Z')//如果是大写字母改成小写
			{
				s[j]-='A'-'a';
			}
		}
		cout<

T3内部元素之和

输入一个整数矩阵,计算位于矩阵内部的元素之和。所谓矩阵内部的元素,不在第一行和最后一行的元素以及第一列和最后一列的元素。

时间限制:1000  内存限制:65536

输入

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

输出

输出对应矩阵的内部元素和

样例输入

3 3

3 4 1

3 7 1

2 0 1

样例输出

7

解析:

此题考查循环嵌套及复杂逻辑表达式

解法1

在循环中判断如果不是第一行也不是最后一行并且不是第一列也不是最后一列,就累加,最后输出结果

#include
using namespace std;
int a[105][105];
int ans=0;
int main()
{
    int m,n;
    cin>>m>>n;
    for (int i=1;i<=m;i++)
    {
        for (int j=1;j<=n;j++)
        {
            cin>>a[i][j];
            if (i!=1&&i!=m&&j!=1&&j!=n)//判断是否为内部元素
			{
				ans+=a[i][j];
			 } 
        }
    }
    cout<

解法2

找出内部元素范围,第二行到倒数第二行,第二列到倒数第二列,使用两层循环直接累加,计算结果

#include
using namespace std;
int a[105][105];
int ans=0;
int main()
{
    int m,n;
    cin>>m>>n;
    for (int i=1;i<=m;i++)
    {
        for (int j=1;j<=n;j++)
        {
            cin>>a[i][j];
        }
    }
    for (int i=2;i

T4整数排序

给定10个整数的序列,要求对其重新排序。排序要求:

1.奇数在前,偶数在后;

2.奇数按从大到小排序;

3.偶数按输入顺序逆序排序。

时间限制:1000  内存限制:65536

输入

输入一行,包含10个整数,彼此以一个空格分开,每个整数的范围是大于等于0,小于等于100。

输出

按照要求排序后输出一行,包含排序后的10个整数,数与数之间以一个空格分开。

样例输入

4 7 3 13 11 12 0 47 34 98

样例输出

47 13 11 7 3 98 34 0 12 4

解析 

此题考查排序算法,由于对奇数和偶数的排序方法要求不同,所以第一步是将输入的整数根据奇偶性分别存入奇数数组和偶数数组,然后对奇数数组进行从小到大的排序,可以使用冒泡,选择或者插入排序算法,然后先输出奇数数组,再输出偶数数组

#include
using namespace std;
int ji[11];//奇数数组 
int ou[11];//偶数数组 
int main()
{
    int m=0,n=0;//m为奇数个数,n为偶数个数 
    for (int i=1;i<=10;i++)
    {	
    	int d;
		cin>>d;
        if(d%2==1)//奇数保存到奇数数组 
        {
        	ji[m]=d;
        	m++;
		}
        else //偶数保存到偶数数组 
        {
        	ou[n]=d;
        	n++;
		}
    }
    for(int i=1;i0;j--)
    	{ 
			if(ji[j]>ji[j-1])
            	swap(ji[j],ji[j-1]);
        } 
	} 
    for(int i=0;i=0;i--)//逆序输出偶数数组 
        cout<

T5计算好数

若将一个正整数化为二进制数,在此二进制数中,我们将数字1的个数多于数字0的个数的这类二进制数称为好数。

例如:

(13)10 = (1101)2,其中1的个数为3,0的个数为1,则此数是好数;

(10)10 = (1010)2,其中1的个数为2,0的个数也为2,则此数不是好数;

(24)10 = (11000)2,其中1的个数为2,0的个数为3,则此数不是好数;

对于给定的N,写程序求出1~N之中(包括1与N)中的好数个数。

时间限制:1000  内存限制:65536

输入

一个整数,题目中的N(N ≤ 1000)

输出

一个整数,表示1~N之中(包括1与N)中的好数个数

样例输入

10

样例输出

5

解析

此题考查的是进制转换,将1-n之间的所有数字转换成二进制,计算有多少个1和多少个0,比较1和0的多少,然后对符合好数的进行计数。

#include
using namespace std;
int cnt=0,n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {	
		int yi=0;//1的个数 
		int ling=0;//0的个数 
    	int k=i;//使用k进行转换 
    	while(k)//模2除2计算出每一位 
    	{
			if(k%2==1)
				yi++;
			else
				ling++;
			k/=2;
		}
		if(yi>ling)//好数判断 
			cnt++;
	}
	cout<

你可能感兴趣的:(电子学会C++二级,c++,c语言,算法)