伯乐论坛网

搜索
查看: 131|回复: 3

2022年第十三届蓝桥杯大赛C组真题C/C++解析(上)

[复制链接]

2

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-10-15 06:54:27 | 显示全部楼层 |阅读模式
**今天给大家带来2022年,第十三届蓝桥杯大赛的真题解析**


*转眼间,距离考试已经过去很长时间了,今天解元给大家解析一下,有问题欢迎大家指点*
:smail:
前言

  *考试已经结束,有的同学可能对于这次考试不太理想,本以为能靠填空题能得省三,可谁知道填空题只有两道。希望大家调整好心态,去迎接更大的挑战。
话不多说,直接上题解*
<hr/> 填空题

1.排列字母

【问题描述】小蓝要把一个字符串中的字母按其在字母表中的顺序排列。
例如,LANQIAO 排列后为 AAILNOQ。
又如,GOODGOODSTUDYDAYDAYUP
排列后为 AADDDDDGGOOOOPSTUUYYY。
请问对于以下字符串,排列之后字符串是什么?
WHERETHEREISAWILLTHEREISAWAY
_这一题送分题,口算都能算出,明显是用ASCII排序的,因为字符在内存中存储情况就是用ASCII,所以直接比大小就ok。下面我用程序的方法给大家写出来_
#include<stdio.h>
#include<string.h>
#include<assert.h>
void String_sore(char arr[], const int len)
{
        assert(arr);
        int  i=0 , j =0;
        char  ret ;
        for (i = 0; i < len; i++)
        {
                for (j = 0; j < len - i; j++)
                {
                        if (arr[j] > arr[j + 1])
                        {
                                ret = arr[j];
                                arr[j] = arr[j + 1];
                                arr[j + 1] = ret;
                        }
                }
        }
        for (i = 0; i < len; i++)
        {
                printf("%c", arr);
        }
}
int main()
{
        char arr[] = { "WHERETHEREISAWILLTHEREISAWAY" };
        int len = strlen(arr);
        String_sore(arr, len);
        return 0;
}
运行结果如下图



我用的是冒泡排序的基本思想,如果大家有更好的方法,欢迎在评论区讨论

<hr/> 2.特殊时间

【问题描述】
2022 年 2 月 22 日 22:20 是一个很有意义的时间,年份为 2022,由 3 个 2
和 1 个 0 组成,如果将月和日写成 4 位,为 0222,也是由 3 个 2 和 1 个 0 组
成,如果将时间中的时和分写成 4 位,还是由 3 个 2 和 1 个 0 组成。
小蓝对这样的时间很感兴趣,他还找到了其它类似的例子,比如 111 年 10
月 11 日 01:11,2202 年 2 月 22 日 22:02 等等。
请问,总共有多少个时间是这种年份写成 4 位、月日写成 4 位、时间写成
4 位后由 3 个一种数字和 1 个另一种数字组成。




合计有212种
哈哈,我实在想不出代码的方式


大家有不同见解欢迎讨论
<hr/> 编程题

1.纸张尺寸

【问题描述】
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸
沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取
下整(实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸,依此类推。
输入纸张的名称,请输出纸张的大小。
【输入格式】
输入一行包含一个字符串表示纸张的名称,该名称一定是 A0、A1、A2、
A3、A4、A5、A6、A7、A8、A9 之一。
【输出格式】
输出两行,每行包含一个整数,依次表示长边和短边的长度。
【样例输入 1】:A0
【样例输出 1】:
1189
841
【样例输入 2】:A1
【样例输出 2】:
841
594
这个就比较简单啦,题目说的是输入纸张的名称,请输出纸张的大小,而初始大小为1189*841,每次对折都是在长边的中间对折,所以要判断那方为长边,而且输出案例也有一定的需求,必须先输出长,再输出宽,所以又加了一个判断
1.1纸张大小代码

#include<stdio.h>
int main()
{
        int x = 1189, y = 841;//定义边长分别为1189和841,为大小A0
        int  n=0;
        scanf("A%d", &n);//输入想要求找的纸张(A0||A2||...)
        while (n)//判断循环几次
        {
                if (x > y)
                {
                        x = x / 2;
                }
                else
                {
                        y = y / 2;
                }
                n--;//n要自减一下哦,直到while判断为假,跳出循环体
        }
        x > y ? printf("%d\n%d", x, y) : printf("%d\n%d", y, x);//因为题目中的输出案例长边总在上面,所以加了个三目操作符
        return 0;
}

<hr/>2.求和

【问题描述】
给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即
S = a1 · a2 + a1 · a3 + · · · + a1 · an + a2 · a3 + · · · + an−2 · an−1 + an−2 · an + an−1 · an.
【输入格式】
输入的第一行包含一个整数 n 。
第二行包含 n 个整数 a1, a2, · · · an。
【输出格式】
输出一个整数 S,表示所求的和。请使用合适的数据类型进行运算。
【样例输入】
4
1 3 6 9
【样例输出】
117
【评测用例规模与约定】
对于 30% 的数据,1 ≤ n ≤ 1000,1 ≤ ai ≤ 100。
对于所有评测用例,1 ≤ n ≤ 200000,1 ≤ ai ≤ 1000。

这一题用的是C++写的,c的话运行速度会比较慢
2.1求和代码

#include<iostream>
using namespace std;
int main()
{
    long long  a, b, n, i, k = 0, sum = 0;//定义所有用到的变量
    cin >> n;
    for (i = 0; i < n; i++)//在这个循环体内完成求和
    {
        cin >> b;
        k += sum * b;
        sum += b;
    }
    cout << k;
    return 0;

}


<hr/>3.数位排序

#include <stdio.h>
#include <stdlib.h>
int arr[1000007];//这里定义全局变量是把内存开辟到了静态区,如果使用局部变量的话,会把栈区撑爆
int  Modulo_except(int n)
{
        int z = 0;
        while (n)
        {
                z += n % 10;
                n /= 10;
        }
        return z;
}
int cmp(const void* e1, const void* e2) //比较排序数据中两个元素的函数
{
        int* pe1= (int*)e1;
        int* pe2 = (int*)e2;
        if (Modulo_except(*pe1) != Modulo_except(*pe2))
        {
                return Modulo_except(*pe1) - Modulo_except(*pe2);
        }
        else
                return *pe1 - *pe2;
}
int main()
{
        int i, n, m;
        scanf("%d %d", &n, &m);
        for (i = 0; i <= n; i++)
        {
                arr = i;//现将i自增的值赋值给数组arr中
        }
        qsort(arr, n + 1, sizeof(arr[0]),cmp);//因为i<=n,所以为n+1
        printf("%d", arr[m]);

        return 0;
}

结语

剩下五题就等《2022年第十三届蓝桥杯大赛C组真题C/C++解析(下)》,大家快快关注我O。

看到这里还不三连

回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-10-15 06:55:01 | 显示全部楼层
有帮助就点个赞吧
回复

使用道具 举报

1

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2022-10-15 06:55:54 | 显示全部楼层
可以可以
回复

使用道具 举报

2

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-10-15 06:56:00 | 显示全部楼层
谢谢支持[爱]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2013 Comsenz Inc.Powered by Discuz!X3.4
快速回复 返回顶部 返回列表