1. 程式人生 > 其它 >藍橋杯 STEMA 考試 C++ 程式設計題模擬題

藍橋杯 STEMA 考試 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;
}