当前位置:   article > 正文

【STEMA考试】蓝桥杯C++中高级试卷(10月、12月)解析答案_蓝桥杯c++历年真题

蓝桥杯c++历年真题

目录​​​​​​​

蓝桥杯2023STEMA考试C++试卷(10月)

STEMA考试 C++中高级试卷(12月)

蓝桥杯2023STEMA考试C++试卷(10月)

一、选择题

1、十进制数189转换成二进制是 (A)

A、10111101

B、11010011

C、11110000

D、11001100

2、定义一个整型变量int a,使用指针存储a的地址,下列选项正确的是(D)

A、int &p = &a

B、int **p = &a

C、int *p = a

D、int *p = &a

3、定义一个字符串数组: char a[1024] =“Welcome to China!":要计算上述字符串的长度,应该使用下列哪个函数(C)

A、 strcat()

B、 stremp()

C、 strlen()

D、 size()

4、己定义变量int a = 10, b = 0:

执行表达式((a = 5) || (b = 1)之后,a和b的值分别是( C)

A、10 0

B、5  1

C、5  0

D、10 1

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

二、编程题

第一题

编程实现:与3有关的数

提示信息:

如果一个正整数的个位可以被3整除,则这个正整数与3有关

例如:

10的个位是0,0能被3整除,故10与3有关;

11的个位是1,1不能被3整除,故11与3无关

19的个位是9,9能被3整除,故19与3有关

题目描述:

给定一个正整数N(1<=Nm=10000),从小到大依次输出1到N之间所有与3有关的数

输入描述:输入一个正整数 (1<=N<=10000)

输出描述:输出一行,表示1到N之间(含1和N)所有与3有关的正整数,从小到大排列,正整数之间以一个空格隔开

样例输入:10

样例输出:3 6 9 10

第二题

编程实现:跳水比赛

题目描述:

某校有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

第三题

编程实现:密文解密

题目描述:

有一段密文,加密规律如下:

原文中所有的字符在字母表中的位置被左移了若干位(如:a左移一位后为z,A左移一位后为Z,f左移三位后为c......)

例如:密文为Ayz,已知加密时原文中的字母被左移了3位,解密后,原文是Dbc。

请根据这个规律,对密文进行解密。

输入描述

共两行

第一行输入一个只包含大小写字母的字符串(长度小于100),表示密文

第二行输入一个正整数n(1<=n<=100000),表示原文中的字母在字母表中的位置被左移的位数

输出描述

输出一个字符串,表示解密后的原文

样例输入:

Ayz

3

样例输出:

Dbc

解题思路:
1、这里需要记住 a对于的位置:97 z对于的位置:122 A对于的位置:65 Z对于的位置90
2、字符加减时,要采用printf()输出

#include<iostream>
#include<cstdio>
using namespace std;
int main ()
{
    char a[100];
    gets(a);
    for(int i=0;a[i]!=0;i++)
    {
        if(a[i]+3>122&&a[i]>='a'&&a[i]<='z')
        printf("%c",(a[i]+3-122-1+97));
        else if(a[i]+3>90&&a[i]>='A'&&a[i]<='Z')
        printf("%c",(a[i]+3-90-1+65));
        else
        printf("%c",a[i]+3);
    }
}

4、编程实现:翻转游戏币

题目描述:

桌面上有n枚游戏币,均为反面朝上,编号依次为1到n。有n个人游戏币的数量与人的数量相等),首先第1个人将所有游戏币翻转,然后第2个人将所有编号是2的倍数的游戏币翻转,接下来第3个人将所有编号是3的倍数的游戏币翻转…以此类推,当最后一个人完成操作后,还有多少枚游戏币正面朝上?

例如:n=4

最初4枚游戏币的状态为:反反反反;经过第1个人翻转后,游戏币的状态为:正正正正;

经过第2个人翻转后,游戏币的状态为:正反正反

经过第3个人翻转后,游戏币的状态为:正反反反;

经过第4个人翻转后,游戏币的状态为:正反反正最后,还有两枚游戏币正面朝上,故答案为2

输入描述:

输入一个正整数n(3≤n≤10),表示游戏币数量及人的数量输出描述:

输出一个整数,表示最终游戏币正面朝上的数量

样例输入:

4

样例输出:

2

解题思路:

1、本题采用了布尔型数组解题。

2、解题程序如下:

#include<iostream>
using namespace std;
bool a[11];
int main ()
{
    int n,b=0;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(j%i==0)
            a[j]=!a[j];
        }
    for(int i=1;i<=n;i++)
    {
        if(a[i])
        b+=1;
    }
    cout<<b;
}

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<iostream>
using namespace std;
const int N=20000;
int a[N],b[N];
int main ()
{
    int n,sum=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(int i=0;i<n-1;i++)
    {
        if(a[i]>a[i+1]&&b[i]==0&&b[i+1]==0)
        {
            b[i]+=2;
            b[i+1]+=1;
        }
        else if(a[i]<a[i+1]&&b[i]==0&&b[i+1]==0)
        {
            b[i]+=1;
            b[i+1]+=2;
        }
        else if(a[i]==a[i+1]&&b[i]==0&&b[i+1]==0)
        {
            b[i]+=1;
            b[i+1]+=1;
        }
        else if(a[i]<a[i+1])
            b[i+1]=b[i]+1;
        else if(a[i]>a[i+1])
        {
            b[i+1]=1;
            if(b[i]==b[i+1])
            {
            for(int j=i;j>=0;j--)
                b[j]+=1;    
            }    
        }    
        else if(a[i]==a[i+1])
        {
            b[i+1]=b[i];
        }
    }
    for(int i=0;i<n;i++)
    {
        sum+=b[i];
    }
    cout<<sum;
}

6、第六题

编程实现:区间最小值

题目描述:

给定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≤108),分别表示整数的数量及查询次数

第二行输入n个整数(0≤整数≤105)

接下来m行,每行输入2个整数a和:(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<iostream>
using namespace std;
const int N=10000;
int w[N],a[N],b[N];
int main ()
{
   int n,m;
   cin>>n>>m;
   for(int i=1;i<=n;i++)
       cin>>w[i];
   for(int i=1;i<=m;i++)
       cin>>a[i]>>b[i];
   for(int i=1;i<=m;i++)
   {
         int min1=10000;
         for(int j=a[i];j<=b[i];j++)
         {
             if(min1>w[j])
                 min1=w[j];    
      }
      cout<<min1<<endl;
   }    
}


STEMA考试 C++中高级试卷(12月)

一、单选题

第 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

二、编程题

第 6 题 问答题

求和

题目描述:

给定 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;

}

第 7 题 问答题

数位和为偶数的数

提示信息:

偶数:能被 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;

}

第 8 题 问答题

填涂颜色

题目描述:

给定一个由 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;

const int N = 10002;

int col[N], row[N];

int main() {

  int n, m, x, y;

  cin >> n >> m >> x >> y;

  int c = 0, r = 0;

  for (int i = 1, a; i <= x; i++) {

    cin >> a;

    col[a]++;

    if (col[a] == 1)

      c++;

  }

  for (int i = 1, a; i <= y; i++) {

    cin >> a;

    row[a]++;

    if (row[a] == 1)

      r++;

  }

  cout << n * m - (c * m + r * n - c * r);

  return 0;

}

第 9 题 问答题

外观数列

提示信息:

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

例如:

给定外观数列的第一项为 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;

char x[10000], y[10000];

int main() {

  int n, lx, t, k;

  cin >> x >> n;

  lx = strlen(x);

  for (int i = 1; i < n; i++) {

    t = 1, k = 0;

    for (int i = 1; i <= lx; i++) {

      if (x[i] != x[i - 1]) {

        y[k] = t + '0';

        y[k + 1] = x[i - 1];

        k += 2;

        t = 1;

      } else {

        t++;

      }

    }

    lx = k;

    memcpy(x, y, sizeof(y));

    memset(y, 0, sizeof(y));

  }

  cout << x;

  return 0;

}

26

第 10 题 问答题

删除数字

题目描述:

老师在黑板上写了一个不超过 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;

string n;

int main() {

  int k;

  cin >> n >> k;

  while (k--) {

    int i, ln = n.size();

    for (i = 1; i < ln; i++) {

      if (n[i] > n[i - 1]) {

        n.erase(i - 1, 1);

        break;

      }

    }

    if (i == ln)

      n.erase(ln - 1, 1);

  }

  cout << n;

  return 0;

}

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号