第十一届蓝桥杯省赛第二场(10.17) C/C++ B组 题目 + 题解

A. 门牌制作 (5分)

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

Ans:624(签到题)
#include <bits/stdc++.h>
using namespace std;

signed main()
{
   
    int res = 0;
    for(int i = 1 ; i <= 2020; i ++){
   
        int tmp = i;
        while(tmp){
   
            res += (tmp%10 == 2);
            tmp /= 10;
        }
    }
    cout<<res<<endl;
    return 0;
}


B. 既约分数

【问题描述】

如果一个分数的分子和分母的最大公约数是 1,这个分数称为既约分数。 例如,3 4 , 5 2 , 1 8 , 7 1 都是既约分数。 请问,有多少个既约分数,分子和分母都是 1 到 2020 之间的整数(包括 1 和 2020)?

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个 整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

Ans:2481215(签到题again)
#include <bits/stdc++.h>
#define int long long
using namespace std;

int gcd(int x,int y){
   
    if(x < y) swap(x,y);
    return y == 0 ? x : gcd(y,x%y);
}
signed main()
{
   
    int res = 0;
    for(int i =1 ; i <= 2020 ; i ++){
   
        for(int j = 1 ; j <= 2020 ; j++){
   
            res += gcd(i,j) == 1;
        }
    }
    cout<<res<<endl;
    return 0;
}


C. 蛇形填数 (10 分)

【问题描述】
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
在这里插入图片描述
在这里插入图片描述

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列 的数是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

Ans:761 (模拟,开二维数组按规律填数字就好了。)
#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main()
{
   
    int a[200][200];
    int i = 0; // row
    int j = 0; // column
    int cnt = 1;
    int flag = 1;  // direction
    while(cnt < 40*40){
   
        a[i][j] = cnt;
        i -= flag;
        j += flag;
        if(flag == 1 && i == -1){
   
            i = 0;
            flag = -1;
        }
        else if(flag == -1 && j == -1){
   
            j = 0;
            flag = 1;
        }
        ++ cnt;
    }
    cout<<a[19][19]<<endl;
    return 0;
}

D.跑步锻炼

【问题描述】

小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了 激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年 10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分

Ans:8879 (简单模拟,模拟天数一天一天增加,判断是否周一或月初)
#include <bits/stdc++.h>
#define int long long
using namespace std;
int days[]={
   0,31,28,31,30,31,30,31,31,30,31,30,31};

int check(int y,int m){
    // leap year
    return m == 2 && (y%400 == 0|| (y%4 == 0 && y%100 != 0));
}
signed main()
{
   
    int y = 2000;
    int m = 1;
    int d = 1;
    int yy = 2020;
    int mm = 10;
    int dd = 1;
    int week = 6-1;
    int res = 0;
    for( ; y <= yy ; y ++){
   
        int lim1 = (y == yy) ? mm : 12;
        for( ; m <= lim1; m ++){
   
            int lim2 = (y == yy && m 
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值