侧边栏壁纸
博主头像
这就是之谦博主等级

我们的征途是星辰大海

  • 累计撰写 182 篇文章
  • 累计创建 3 个标签
  • 累计收到 16 条评论
标签搜索

目 录CONTENT

文章目录

第十一届蓝桥杯大赛软件类省赛第二场 C/C++ 大学 B 组

这就是之谦
2021-03-13 / 0 评论 / 0 点赞 / 322 阅读 / 5,198 字
温馨提示:
本文最后更新于 2021-12-31,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

试题 A: 门牌制作

本题总分:5 分
【问题描述】
小蓝要为一条街的住户制作门牌号。
这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。
小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字
符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个
字符 0,2 个字符 1,1 个字符 7。
请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【参考答案】

624

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,i,j,sum=0;
    for(i=1;i<=2020;i++){//从1-2020循环
        j=i;
        while(j>0){
            a=j%10;//每次判断对10取余,就得到个位的数字
            j=j/10;//判断完个位的数字,就除以10,继续判断
            if(a==2){
                sum++;
            }
        }
    }
    printf("%d",sum);
    return 0;
}

试题 B: 既约分数

本题总分:5 分
【问题描述】
如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。
例如,3/4,5/2,1/8,7/1 都是既约分数。
请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1
和 2020)?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【参考答案】

2481215

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a1,b1,a,b,m,sum=0;
    for(a=1;a<=2020;a++){
        for(b=1;b<=2020;b++){
            if(a>b){//判断哪个大,把大的赋值给a1,小的赋值给b1
                a1=a;
                b1=b;
            }else{
                a1=b;
                b1=a;
            }
            //求最大公约数
            while(b1>0){
                m=a1%b1;//大的对小的取余
                a1=b1;//小的变成大的
                b1=m;//余数变成小的
            }//循环取余,最后b1=0,即m=0,此时a1为最大公约数
            if(a1==1)sum++;//最大公约数是1,就是不能约分的
        }
    }
    printf("%d",sum);
    return 0;
}

附上求最大公约数与最小公倍数的案例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int a,b,t,a1,b1,m;
    scanf("%d%d",&a,&b);
    a1=a;
    b1=b;
    if(a1<b1){
        t=a1;
        a1=b1;
        b1=t;
    }
    while(b1>0){//循环取余
        m=a1%b1;
        a1=b1;
        b1=m;
    }
    printf("%d\n",a1);
    printf("%d\n",(a*b)/a1);
    return 0;
}

试题 C: 蛇形填数

本题总分:10 分
【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【参考答案】

761

【我的思路】

简便方法:题目只要求求20/20,这个数很特别,是个对角线,通过写几组数据找出对角线的规律:1,5,13,25

5 - 1 = 4
13 - 5 = 8
25 - 13 = 12

得出等差数列

答案就来了:

【找规律计算代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,t,sum=1;
    for(i=0,t=0;i<20;i++,t+=4){
        sum+=t;
    }
    printf("%d",sum);

    return 0;
}

实际上真正的按照题目模拟每一次过程

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,j,t,a[40][40],x=1;
    for(i=1;i<40;i++){
        if(i%2!=0){//奇数和偶数自上到下还是自下到上的顺序不同
            for(t=i,j=1;j<=i;j++,t--){
                a[t][j]=x++;//自下到上,行--,列++
            }
        }else{
            for(t=i,j=1;j<=i;j++,t--){
                a[j][t]=x++;//自下到上,行++,列--
            }

        }
    }
    printf("%d",a[20][20]);


    return 0;
}

试题 D: 跑步锻炼

本题总分:10 分
【问题描述】
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了
激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。
小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年
10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【参考答案】

8879

【我的思路】

遍历每一年,每个月,每一天进行判断。

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int y,m,d,sum=0,zhou=6;
    int a[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};

    for(y=2000;y<=2020;y++){//年循环

        if((y%4==0&&y%100!=0)||y%400==0){//判断闰年
            a[2]=29;
        }else{
            a[2]=28;
        }
        for(m=1;m<=12;m++){//月循环
            for(d=1;d<=a[m];d++,zhou++){//日循环
                sum++;//每天1千米
                if(zhou==8){//把周8变成周1
                    zhou=1;
                }
                if(d==1||zhou==1){//如果是月初或者周一,再加1千米
                    sum++;
                }
                if(y==2020&&m==10&&d==1){//截止到2020.10.1
                    printf("%d\n",sum);
                	break;
                }
            }
        }
    }
    return 0;
}

试题 F: 成绩统计

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分
【问题描述】
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是
一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整
数。
【输入格式】
输入的第一行包含一个整数 n,表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
【输出格式】
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分
四舍五入保留整数。
【样例输入】

7
80
92
56
74
88
100
0

【样例输出】

71%
43%

试题F: 成绩统计 7第十一届蓝桥杯大赛软件类省赛第二场 C/C++ 大学 B 组
【样例输出】
71%
43%

【我的思路】

输入即判断,最后转换float计算(为了四舍五入)

【参考代码】

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i,x,n,pass=0,good=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&x);
        if(x>=60){
            pass++;
            if(x>=85){
                good++;
            }
        }
    }
    printf("%.f",pass*100.0/n);
    printf("%%\n");
    printf("%.f",good*100.0/n);
    printf("%%");
    return 0;
}

试题 G: 回文日期

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分
【问题描述】
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2
日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,
恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为
不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA
型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个
ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千
年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个
ABABBABA 型的回文日期各是哪一天。
【输入格式】
输入包含一个八位整数 N,表示日期。
【输出格式】
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下
一个 ABABBABA 型的回文日期。
【样例输入】

20200202

【样例输出】

【样例输出】

20211202
21211212

【评测用例规模与约定】
对于所有评测用例,10000101 ≤ N ≤ 89991231,保证 N 是一个合法日期的
8 位数表示。

【我的思路】

遍历每年每月每天,判断这天是不是回文日期,进而再次判断是不是ABABBABA 型的回文日期。

【参考代码】

#include <stdio.h>
#include <stdlib.h>

//判断是不是回文日期
int huiwen(int y,int m,int d){
    int i,a[10];
    a[1]=y/1000;
    a[2]=y/100%10;
    a[3]=y/10%10;
    a[4]=y%10;
    a[5]=m/10;
    a[6]=m%10;
    a[7]=d/10;
    a[8]=d%10;
    for(i=1;i<=4;i++){
        if(a[i]!=a[9-i]){
            break;
        }
    }
    if(i==5){
        return 1;
    }else{
        return 0;
    }
}

//在回文日期的基础上判断是不是ABABBABA
int niubihuiwen(int y){
    int a1=y/1000;
    int a2=y/100%10;
    int a3=y/10%10;
    int a4=y%10;
    if(a1==a3&&a2==a4){
        return 1;
    }else{
        return 0;
    }
}

int main()
{
    int str[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int y,m,d;
    int y1,m1,d1;
    int all;
    scanf("%d",&all);
    y=all/10000;
    m=all%10000/100;
    d=all%100;
    //printf("%d %d %d %d\n",all,y,m,d);
    int t=0;
    for(y1=y;;y1++){//遍历年
        for(m1=m;m1<=12;m1++){//遍历月
            if((y%4==0&&y%100!=0)||y%400==0){//判断闰年
                str[2]=29;
            }else{
                str[2]=28;
            }
            for(d1=d+1;d1<=str[m1];d1++){//遍历日
                if(huiwen(y1,m1,d1)){
                    if(t==0){//让第一个回文值只输出一次
                        printf("%d%02d%02d\n",y1,m1,d1);
                        t=1;
                    }
                    if(niubihuiwen(y1)){
                        printf("%d%02d%02d\n",y1,m1,d1);
                        return 0;
                    }
                }
            }
            d1=1;//日期归1
        }
        m1=1;//月份归1
    }
    return 0;
}

0

评论区