蓝桥杯 STEMA 考试 C++ 编程题模拟题

本文提供了蓝桥杯STEAM考试的C++编程模拟题,包括初级和中级两个组别,涉及统计、图形面积比较、字符串搜索、路径查找等多种编程题目,旨在提升青少年的编程能力。

蓝桥杯 STEMA 考试 C++ 编程题模拟题

该套题为蓝桥杯青少年创意编程组官方发布的考试白皮书上的模拟题。

初级组

编程题第一题

编程实现: 做统计。
输入 10 个正整数,以空格分隔。依次输出其中的最大值、最小值以及平均值,以逗号分隔。
样例输入:
1 2 3 4 5 6 7 8 9 10
样例输出:
10,1,5.5

#include <iostream>
using namespace std;

int main()
{
    int maxNum = 0, minNum = 0x3f3f3f3f, sum = 0, x;
    for (int i = 0; i < 10; ++i)
    {
        cin >> x;
        sum += x;
        if (x > maxNum)
        {
            maxNum = x;
        }
        if (x < minNum)
        {
            minNum = x;
        }
    }
    cout << maxNum << "," << minNum << "," << sum / 10.0 << endl;
}

编程题第二题

编程实现: 比大小。
输入一个正方形的边长(a)及一个长方形的长与宽(b、c),然后比较两个图形的面积。如果长方形面积大, 输出“RECTANGLE”;如果正方形面积大,输出“SQUARE”;如果一样大,输出“SAME”。
输入描述:
输入正整数a、b、c(0 < a、b、c ≤ 1000),分别代表正方形的边长和长方形的长与宽。
输出描述:
如果长方形面积大,输出“RECTANGLE”;
如果正方形面积大,输出“SQUARE”;
如果一样大, 输出 “SAME”。
样例输入:
5 4 6
样例输出:
SQUARE

#include <iostream>
using namespace std;

int main()
{
    int a, b, c, s1, s2;
    cin >> a >> b >> c;
    s1 = a * a;
    s2 = b * c;
    if (s2 > s1)
    {
        cout << "RECTANGLE" << endl;
    }
    else if (s1 > s2)
    {
        cout << "SQUARE" << endl;
    }
    else
    {
        cout << "SAME" << endl;
    }
}

编程题第三题

编程实现: 数单词。
编程统计输入句子中出现“lanqiao”字样的个数。(注意,“lanqiao”字样可以是不同大小写字母的组合,例如:LanQIAO、LanQiao 等)
输入描述:
输入一个字符串(0 ≤ 字符串长度 ≤ 100)。
输出描述:
输出该字符串中“lanqiao”字样出现的次数。(注意:“lanqiao”字样可以是不同大小写字母的组合)
样例输入:
Lanqiaoqingshao,lanqiaojingsai,Lanqiaoceping.
样例输出:
3

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    cin >> s;
    int len = s.size();
    for (int i = 0; i < len; ++i)
    {
        s[i] = (char)tolower(s[i]); // 转换成小写字母
    }
    const string t = "lanqiao";
    int cnt = 0;
    for (int i = 0; i <= len - 7; ++i)
    {
        if (t == s.substr(i, 7))
        {
            cnt++;
        }
    }
    cout << cnt << endl;
    return 0;
}

编程题第四题

编程实现: 查找路径。
有一张 m×n 个小方格的地图,一个机器人位于地图的左上角(如图标记为 Start 的地方),它每步只能向右或者向下移动一格,如果走到右下角的终点(如图标记为 Finish 的地方),有多少种不同的方法?
在这里插入图片描述

例如,一个 3×2 的地图,行走的方法数是 3 种,分别是:

  1. 右 -> 右 -> 下
  2. 右 -> 下 -> 右
  3. 下 -> 右 -> 右

输入描述:
两个整数 m (m ≤ 100) 和 n ( n ≤ 100),代表地图的行数和列数。
输出描述:
一个整数,表示行走的方法数。
样例输入:
8 8
样例输出:
3432

#include <iostream>
using namespace std;

const int N = 100;
long long roads[N + 2][N + 2] = {0}; // roads[i][j]: 从起点 (0, 0) 到 (i, j) 的路线总数

int main()
{
    int m, n;
    cin >> m >> n;
    // 第 0 行、第 0 列的格子都只有一条路线
    for (int i = 0; i < m; ++i)
    {
        roads[i][0] = 1;
    }
    for (int i = 0; i < n; ++i)
    {
        roads[0][i] = 1;
    }
    for (int i = 1; i < m; ++i)
    {
        for (int j = 1; j < n; ++j)
        {
            roads[i][j] = roads[i - 1][j] + roads[i][j - 1];
        }
    }
    cout << roads[m - 1][n - 1] << endl;
    return 0;
}

中级组

编程题第一题

背景信息:
小蓝家的灯是拉线式开关的,拉一次灯开,再拉一次灯关,未拉之前灯是熄灭状态。
编程实现: 拉线开关。
输入一个正整数 M(1 < M < 100),作为小蓝拉动开关的次数,判断拉动 M 次后,灯是点亮状态还是熄灭状态。
输入描述:
输入一个正整数 M 作为拉动开关的次数(1 < M < 100)
输出描述:
如果灯是点亮状态输出整数“1”,如果灯是熄灭状态输出整数“0”。
样例输入:
5
样例输出:
1

#include <iostream>
using namespace std;

int main()
{
    int m;
    cin >> m;
    cout << m % 2 << endl;
}

编程题第二题

编程实现: 数字组合。
用户输入一个正整数N(3<=N<=9)。从 0 到 N 之间的所有正整数(包含 0 和 N)中选择三个,组成一个三位数(0 不能作为百位数),且这个三位数为奇数,请计算出共有多少种满足条件的三位数组合。(注意:组成的三位数各位上的数字不能重复)
输入描述:
输入一个正整数 N(3<=N<=9)
输出描述:
输出满足条件的三位数组合的个数
样例输入:
3
样例输出:
8
上述输入输出样例的进一步解释:
用户输入的正整数,即样例输入为 3,也就是将 0、1、2、3 四个数字进行组合。符合要求的三位数为:103、123、203、213、201、231、301、321 共 8 个,所以样例输出为 8。

#include <iostream>
using namespace std;

int main()
{
    int n, cnt = 0;
    cin >> n;
    for (int i = 1; i <= n; ++i) // 百位
    {
        for (int j = 0; j <= n; ++j) // 十位
        {
            if (i != j)
            {
                for (int k = 1; k <= n; k += 2) // 个位
                {
                    if (k != i && k != j)
                    {
                        cnt++;
                    }
                }
            }
        }
    }
    cout << cnt << endl;
    return 0;
}

编程题第三题

编程实现: 报数模拟。
有 n 个人围成一个圈,从 1 到 n 按顺序排好号。然后从第一个人开始顺时针报数(从 1 到 3 报数),报到 3 的人退出圈子后,后面的人继续从 1 到 3 报数,直到留下最后一个人游戏结束,问最后留下的是原来第几号。
输入描述:
输入一个正整数 n(4 < n < 600)
输出描述:
输出最后留下的人,原来的编号是多少?
样例输入:
5
样例输出:
4

#include <iostream>
#include <queue>
using namespace std;

int main()
{
    int n;
    cin >> n;
    queue<int> q;
    for (int i = 1; i <= n; ++i)
    {
        q.push(i);
    }
    int cnt = 0;
    while (q.size() > 1)
    {
        cnt++;
        if (cnt % 3 != 0)
        {
            int x = q.front();
            q.push(x);
        }
        q.pop();
    }
    cout << q.front() << endl;
    return 0;
}

编程题第四题

提示信息:
闰年分为普通闰年和世纪闰年。
普通闰年:公历年份是 4 的倍数,且不是 100 的倍数,为普通闰年。(如 2004 年就是普通闰年)。
世纪闰年:公历年份是整百数的,必须是 400 的倍数才是世纪闰年(如 1900 年不是世纪闰年,2000 年是世纪闰年)。
所以有人将此规则总结为:四年一闰,百年不闰,四百年再闰。
闰年的一年为 366 天,闰年的二月份为 29 天。平年一年为 365 天,平年的二 月为 28 天。
每年的 1、3、5、7、8、10、12 月份为 31 天,4、6、9、11 月份为 30 天。
**编程实现:**算天数。
用户输入未来的某一天,输入格式为如 2021 6 1,编程计算这一天和今天相差多少天?(例如:今天和明天是相差一天)星期几?(注意:输出格式为 星期的数字值并在其前加“*”)。
样例输入:
2021 6 1
样例输出:
183
*2

#include <iostream>
using namespace std;

bool isLeap(int y)
{
    return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}

int main()
{
    const int Y = 2021, M = 1, D = 14, W = 4; // 今日日期
    int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    days[2] = 28 + (int)isLeap(Y);
    int y, m, d;
    cin >> y >> m >> d;
    int i = Y, j = M, k = D, w = W, cnt = 0;
    while (!(i == y && j == m && k == d))
    {
        cnt++;
        w++;
        if (w > 7)
        {
            w = 1;
        }
        k++;
        if (k > days[j])
        {
            k = 1;
            j++;
            if (j > 12)
            {
                j = 1;
                i++;
                days[2] = 28 + (int)isLeap(i);
            }
        }
    }
    cout << cnt << endl
         << '*' << w << endl;
    return 0;
}

编程题第五题

背景信息:
一家酒店有 F 层高(0 < F < 100),每层都有 n 个房间(0 < n < 100),房间门牌号由不少于 3 位的数字组成:后两位是房间号,从 1 开始,不间断地排到 n,不足两位的前面补零;前面一或两位是楼层号,从 1 开始,不间断地排到 F,前面不补零。如 1 楼第 8 个房间门牌号是 108,12 楼第 16 个房间门牌号是 1216。
现在要为每个房间制作一个门牌号码的金属牌,每个金属牌都要定制模具,数字居中显示。但如果某房间门牌上下颠倒过来的号码与原号码一模一样,就需要做一个特殊记号,以免混淆方向。
例如:8008、1691、6119、818、619 等等。
因为数字 6 倒过来是 9;9 倒过来是 6;0、1、8 倒过来还是原数;其他数字倒过来不构成数字。对于多位数 618,倒过来看应该是 819,与原来不一样, 就不用做记号了。
编程实现: 标记门牌号。
输入楼层数 F 和房间数 n,计算有多少房间的门牌号码需要做特殊记号。
输入描述:
输入两个正整数 F(0 < F < 100)和 n(0 < n < 100)中间一个空格隔开,代表酒店的楼层数和每层房间数。
输出描述:
输出需要做特殊记号的门牌数。
样例输入:
2 5
样例输出:
1

#include <iostream>
using namespace std;

bool check(int num)
{
    int t[10] = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};                         // i 与 t[i] 互为颠倒
    int a = num / 1000, b = num / 100 % 10, c = num / 10 % 10, d = num % 10; // 千 百 十 个 位
    if ((a == 0 && t[b] == d && t[c] == c) || (a != 0 && t[a] == d && t[b] == c))
    {
        return true;
    }
    else
    {
        return false;
    }
}

int main()
{
    int f, n, cnt = 0;
    cin >> f >> n;
    for (int i = 1; i <= f; ++i)
    {
        for (int j = 1; j <= n; ++j)
        {
            int num = i * 100 + j;
            if (check(num))
            {
                cnt++;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值