2019年蓝桥杯c/c++C组个人总结及部分题解

2019年蓝桥杯c/c++C组个人总结及部分题解

0x00. 先说说个人感受吧,,,

感受就是走出考场的时候挺sad的,感觉就有两道题白送了,在回去的滴滴车上太概和acm大佬(@w_qhai,@jieyao)探讨了一下,,,果然是没有拿到该的分数。总结一句就是凉了。下面说说各题的题解, 我只能记得起部分题目, 可能不全, 但题目大意是对的.

刚查了成绩,,, 省三,,, 说到底还是太菜,,,, 哎,,, 考上本科再说蓝桥杯的事吧~

0x01. 第一题

题目大意是求0-2019中数位上包含2,0,1,9的数列,对这个数列求和...(PS. 据说A组第一题是求数列的平方和)

/*
具体思路:对0-2019遍历一遍,对每个数字取他每一位的数字,进行验证,如果等于2,0,1,9中的某一个数,则把这个数加进sum里面, 遍历结束输出sum的值就是答案
//下面是代码
//感谢评论区大佬指出错误,在下还是太弱了!
*/
#include <iostream>
using namespace std;
int main(void)
{
    int num=2019;
    int sum=0;
    int a,b,c,d;
    for(int i=0;i<=num;i++){
        a=i/1000;
        b=i/100%10;    //这里要对10取余
        c=i/10%10;    //这里要对10取余
        d=i%10;
        if(i>=0&&i<10){
            if(d==2||d==0||d==1||d==9){
                sum+=i;
                cout<<i<<endl;
            }
        }
        if(i>=10&&i<100){
            if(    c==2||c==0||c==1||c==9||
                d==2||d==0||d==1||d==9){
                sum+=i;
                cout<<i<<endl;
            }
        }
        if(i>=100&&i<1000){
            if(    b==2||b==0||b==1||b==9||
                c==2||c==0||c==1||c==9||
                d==2||d==0||d==1||d==9){
                sum+=i;
                cout<<i<<endl;
            }
        }
        if(i>=1000&&i<10000){
            if(    a==2||a==0||a==1||a==9||
                b==2||b==0||b==1||b==9||
                c==2||c==0||c==1||c==9||
                d==2||d==0||d==1||d==9){
                sum+=i;
                cout<<i<<endl;
            }
        }
    } 
    cout<<sum<<endl;//num==40时,sum==574 num==2019时, sum==1905111
    return 0;
}

0x02. 第二题

题目大意是小明有一块5*3的矩形, 每次要切成面积最大的正方形, 问最多能切成多少正方形,第一次3*3, 第二次2*2 第三次1*1 第四次1*1本就是正方形, 所以小明可以得到4个正方形, 题目要求是给你2019*324 的矩形,小明最多可以得到多少个正方形....

/*
具体思路: 递归...如果A>B则a-b sum+1 继续进入递归  如果 A<B则b-a sum+1 继续进入递归 直到 a或者b为0的时候sun+1之后退出递归~ 最后输出sum的值就是答案
下面是代码
*/
#include <iostream>
using namespace std;

int times=0;
int f(int x,int y)
{
    if(x==0||y==0){
        return 1;
    }
    x>y ? f(x-y,y): f(x,y-x);
    times++;
    cout<<x<<" "<<y<<endl;
}
int main(void)
{
    
    //5*3 3*3 2*2 1*1 1*1 
    f(2019,324);
    cout<<times<<endl; 
    return 0;
} 

0x03. 第三题

题目大意: 字母映射 A代表1 Z代表26 AA代表27 AZ就代表52 问2019代表多少?

/*
具体思路: 26进制,用excel就能得到答案~ 答案是BYQ 如下图
这道题代码我有时间在写吧
*/

lanqiao-3.png

0x04. 第四题

题目大概 是1-49 中每次随机取出7个数 然后取这7个数的中位数 总共取7次 然后再取这7组数中位数的中位数 找出中位数最大的随机数据 每次随机取数据1-49不能重复使用

//这题大概意思是1-49平分成7等份,每份7个数字,
//然后对每一份数字取中位数,在将7份数字的中位数再取中位数
//让你求最大的中位数可能是多少
//这道题我考试时没看懂题目,,,,以为是全排列的题目,结果排了80+分钟,没出答案,,,,
//今天一分析,好简单啊,,,但是代码我还是不知道咋写
//下面是思路
/*
如下图,我们要找的是D4这个单元格的数字,并且要使这个数字尽可能地大
那么可以看到如图中红色的数字是肯定比D4大的 红色数字一共有15个
所以49-15===34 答案是34
*/

2019-lanqiao-4.jpg

0x05. 第五题

题目大意: 自然数中前5个素数是 2 3 5 7 11 那么第2019个素数是多少哇

//这道题和1一样简单,,,
//我比赛时鬼迷心窍的填了2019...哇槽....我的小心脏啊
//下面代码
#include <iostream>
#include <math.h>
using namespace std;
int main(void)
{
    //第2019个素数
    int times=0;
    int i,j;
    int k;
    for(i=2;times<2019;i++){
        k=sqrt(i);
        for(j=2;j<=k;j++){
            if(i%j==0)
                break;
        }
        
        if(j>=k+1){
            times++;
            cout<<i<<" "<<times<<endl;//答案17569
        }
    }
    return 0;
}

0x06. 第六题

题目大意: 题目我不记得怎么描述了, 只记得这道题应该是二维数组顺时针旋转90°

//这道题嘛, 吧行变成列, 把列变成行逆序输出就好~
//注意这道题输出是请注意末尾的空格,,,不然容易出现PE(Presentation Error)
//下面代码
#include <stdio.h>
#include <iostream>
int main(int argc, char *argv[])
{
    int number[1000][1000]; 
    int times,row,line;
        scanf("%d %d",&row,&line);
        for(int i=0; i<row; i++)
            for(int j=0; j<line; j++)
                scanf("%d",&number[i][j]);
                
        for(int i=0; i<line; i++){
            for(int j=row-1; j>=0; j--){
                if(j==row-1)
                    printf("%d",number[j][i]);
                else
                    printf(" %d",number[j][i]);
            }
            printf("\n");
        }
    return 0;
}

0x07. 第七题 做这道题是真饿啊

题目记不清了,,,, 原谅我老年痴呆...

0x0. 第八题

题目大意: 给一个不超过100000长度的字符串 给定整数K,,,问Alice这个子串在K个字符长度内有没有遇到Bob,,, 反之亦可

//先上课去啦 明天写,,,,

一言预留位

添加新评论