2020年第十届C/C++ B组第二场蓝桥杯省赛真题(自己整理的,谨慎参考)

第一题:门牌制作


题目描述
小蓝要为一条街的住户制作门牌号。这条街一共有2020位住户,门牌号从1到2020编号。小蓝制作门牌的方法是先制作0到9这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌1017需要依次粘贴字符1、0、1、7,即需要1个字符0,2个字符1,1个字符7。请问要制作所有的1到2020号门牌,总共需要多少个字符2?


题目分析
暴力搜索,判断每个位置的字符是否满足条件


题目代码
#include <iostream>
using namespace std;
int main(){
    int ans=0;
    for(int i=1;i<=2020;i++)
    {
        int num=i;
        while(num){
            if(num%10==2) ans=ans+1;
            num/=10;
        }
        
    }
    cout<<ans<<endl;
    return 0;
}
 

题目答案

624

第二题:既约分数

题目描述
如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,3/4,5/2,1/8,7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1和2020)
题目分析
暴力搜索,通过最大公约数判断
题目代码

#include <iostream>

using namespace std;

int gcd(int a,int b)//最大公约数 
{
    if(a%b==0) return b;
    else return gcd(b,a%b);

int main(){
    int i,j,ans=0;
    for(i=1;i<=2020;i++)//分子 
    {
        for(j=1;j<=2020;j++)//分母 
        {
            if(gcd(i,j)==1)
            {
                ans++;    
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

第三题:蛇形填数
题目描述
如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。容易看出矩阵第二行第二列中的数是5。请你计算矩阵中第20行第20列的数是多少?
1      1 2 6 7 15 …
2      3 5 8 14 … 
3      4 9 13 … 
4      10 12 …
5      11 …
题目分析

可以将图形顺时针旋转45度,我们可以发现第一行是1,加4变成第二行第二个数,第二行第二个数加8就是第三行第三个数,依次类推....就可以算出来了(我这是纯纯的找规律,网上还有其他解法,主要这是填空题,怎么快怎么来)

1行1列            1                     
                    3   2                    +4
2行2列       4   5   6                 
              10   9   8   7              +8
3行3列 11 12 13 14 15           
.................                              +12

题目代码

#include <iostream>
using namespace std;
int main(){
    int i,number=1;
    for(i=1;i<20;i++)
    {
        number=number+4*i;
        
        
    }
    cout<<number<<endl;
    return 0;
}


题目答案

761

第四题:跑步锻炼


题目描述
小蓝每天都锻炼身体。正常情况下,小蓝每天跑1千米。如果某天是周一或者月初(1日),为了激励自己,小蓝要跑2千米。如果同时是周一或月初,小蓝也是跑2千米。小蓝跑步已经坚持了很长时间,从2000年1月1日周六(含)到2020年10月1日周四(含)。请问这段时间小蓝总共跑步多少千米?
题目分析
首先算出总的天数,和月份数,然后求出一共有多少个周一,和周一里面为月初的天数
最后总天数+周一天数+月初天数 - 周一和月初重合天数
题目代码

//跑步锻炼 
#include <iostream>
using namespace std;

int run_nian(int year){
    return (year%400==0)||(year%4==0&&year%100!=0);

int main(){
    int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int day=0;
    //计算2000年1月1日到2020年9月低 
    for(int i=2000;i<=2020;i++)
    {
        
        if(run_nian(i))month[2]=29;
        else month[2]=28;
        for(int j=1;j<=12;j++) {
            if(i==2020&&j==10)break;
        day+=month[j];
    }
    }

    
    
    int month_first=21*12-2;//计算从头到尾的月初的个数 
    int week=6;
    int monday=0;//记录星期一的个数 
    int week1=0;
    int m_m=0;//既是星期一又是月初 
    
    //计算 从头到尾的星期一个数和既是星期一又是月初的个数 
    for(int m=2000;m<=2020;m++){
        if(run_nian(m)){
        month[2]=29;
        for(int n=1;n<=12;n++){
            if(m==2020&&n==10)break;
            for(int t=1;t<=month[n];t++){
                
                week1=week%7;
                if(week1==1){
                monday++;
                if(t==1)m_m++;}
                week++;
                }
                
                
        }
    }
    else{
        month[2]=28;
        for(int n=1;n<=12;n++){
        if(m==2020&&n==10)break;
            for(int t=1;t<=month[n];t++){
                week1=week%7;
                if(week1==1){
                monday++;
                if(t==1)m_m++;}
                week++;}
                
        }
    } 

}
 
    int ans=0;
    ans=day+1+month_first+monday-m_m;
    cout<<ans<<endl;
    return 0;
}
 

题目答案

8879

第六题成绩统计

题目描述
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。如果得分至少是60分,则称为及格。如果得分至少为85分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。
【输入格式】 输入的第一行包含一个整数n,表示考试人数。接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
【输出格式】 输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分四舍五入保留整数。
【样例输入】
7
80
92
56
74
88
100
0
【样例输出】
71%
43%
题目代码

#include <iostream>
#include <stdio.h>
using namespace std;
int a[10000]={0};
int main(){
    int m,jige=0,youxiu=0;
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>a[i];
    }
    for(int i=0;i<m;i++){
        if(a[i]>=60) jige++;
    }
    for(int i=0;i<m;i++){
        if(a[i]>=85) youxiu++;
    }
    cout<<jige*100/m<<"%"<<endl;
    cout<<youxiu*100/m<<"%"<<endl;
}

第七题:回文日期
题目描述
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位数表示。
题目分析

  1. 直接枚举年份 a,将其翻转得到 b,那么 a + b 就是一个回文数;
  2. 用 substr 分离出月份和天数,再判断月份和天数是否合法;

题目代码

#include <iostream>
#include <algorithm>

using namespace std;

int days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check(int year)
{
    return year % 400 == 0 || year % 4 == 0 && year % 100 != 0;
}

int get_day(int year, int month)
{
    if(month == 2) return 28 + check(year);
    return days[month];
}

int main()
{
    int n;
    cin >> n;
    
    string ans1, ans2;
    bool flag1 = false, flag2 = false;
    for (int i = n / 10000; i <= 9999; i ++)
    {
        string a = to_string(i);
        string b = a;
        reverse(b.begin(), b.end());
        if(a + b <= to_string(n)) continue;
        
        int month = stoi(b.substr(0, 2));
        int day = stoi(b.substr(2, 2));
        if(month < 1 || month > 12) continue;
        if(day < 1 || day > get_day(i, month)) continue;
        
        string s1 = a.substr(0, 2);
        string s2 = a.substr(2, 2);
        if(!flag1) ans1 = a + b, flag1 = true;
        if(!flag2 && s1 == s2 && s1[0] != s1[1]) ans2 = a + b, flag2 = true;

        if(flag1 && flag2) break;
    }
    
    cout << ans1 << endl;
    cout << ans2 << endl;
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值