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

第十一届蓝桥杯省赛第二场C/C++ B组

A.门牌制作

第十一届蓝桥杯省赛第二场C/C++ B组题解_第1张图片
题意

制作从1到2020这些数字里面需要使用后多少个字符2;

思路

for循环,并且把数字拆分,从每一位去判断。

代码

#include
using namespace std;
int solve(int n)
{
     
    int ant=0;
    while(n)//把数字拆分
    {
     
        int x=n%10;
        if(x==2)ant++;
         n/=10;
        }return ant;
    }
int main()
{
        int sum=0;
    for(int i=1;i<=2020;i++)
    {
     
        sum+=solve(i);
    }cout<<sum<<endl;
}//答案624

B.即约分数

第十一届蓝桥杯省赛第二场C/C++ B组题解_第2张图片

题意

判断从1到2020中有多少个即约分数。

思路

求最大公约数,gcd判断即可,符合条件就累加;

代码

#include
#define ll long long
using namespace std;
ll gcd(ll a,ll b)//求最大公约数
{
     
    return b==0?a:gcd(b,a%b);
    }
int main()
{
     
    int sum=0;
    for(ll i=1;i<=2020;i++){
     
    for(ll j=1;j<=2020;j++){
     
    if(gcd(i,j)==1)//判断是否符合条件
    sum++;}}
    cout<<sum<<endl;
}
//答案2481215

C.蛇形填数

第十一届蓝桥杯省赛第二场C/C++ B组题解_第3张图片

题意

按照图片的走法,最后第20行第20列的数字为多少?

思路

因为是道填空题,本人就直接找规律求解了(相信在座各位大佬肯定可以编程写出)。1,5,13,25…d1=4,d2=8,d3=12…dn=4*n;

代码

#include
using namespace std;
int main()
{
     
    int sum,n;
    while(cin>>n){
     
    int d=1,sum=1;
    for(int i=1;i<n;i++)
    {
     
        d=4*i;
        sum+=d;
    }cout<<sum<<endl;}
}//答案761

D.跑步锻炼

第十一届蓝桥杯省赛第二场C/C++ B组题解_第4张图片

题意

从2000.01.01周六到2020.10.01周四,这些时间内,如果是月初或者周一就跑2千米,其他时间跑1千米。

代码

#include
using namespace std;
int main()
{
     

    int year=2000,month=1,day=1,week=6,sum=0;
    int a[13]={
     0,31,28,31,30,31,30,31,31,30,31,30,31};
    while(year!=2020||month!=10||day!=1)
    {
     

        if((year%400==0)||(year%4==0&&year%100!=0))//判断闰年
            {
     a[2]=29;}
        else {
     a[2]=28;}day++;//天数累加
        week=(week+1)%7;//weak==0代表星期天
        if(day>a[month])//判断天数是否大于当月的天数
        {
     
            day=1;
            month++;
        }
        if(month>12)//判断是否超过12月
        {
     
            month=1;
            year++;
        }
        if(day==1||week==1)//判断是否符合题意条件
        {
     
            sum++;//月初或者周一就多加一次
        }
        sum++;
    }cout<<sum+2<<endl;//加上第一天与最后一天
}//答案8879

F.成绩统计

第十一届蓝桥杯省赛第二场C/C++ B组题解_第5张图片
第十一届蓝桥杯省赛第二场C/C++ B组题解_第6张图片第十一届蓝桥杯省赛第二场C/C++ B组题解_第7张图片

题意

输入一些成绩,成绩大于60分则为及格,大于85分则为优秀,输出及格率与优秀率(答案需要四舍五入并且保留整数与百分号)

思路

写两个if语句判断,并且累加,最后输出及格率与优秀率时,需要加上0.5,就可以有四舍五入的效果,(需要注意的就是输出需要四舍五入)。

代码

#include
using namespace std;
int main()
{
     
    int n,x;
    while(cin>>n)
    {
     
        float sum1=0,sum2=0;
        for(int i=0;i<n;i++)
        {
     
            cin>>x;
            if(x>=60)//判断及格
                sum1++;
            if(x>=85)//判断优秀
                sum2++;
        }
       int a=float(sum1/n*100+0.5);//产生四舍五入的效果
       int b=float(sum2/n*100+0.5);
       cout<<a<<"%"<<endl;
       cout<<b<<"%"<<endl;
    }return 0;
}

G.回文日期
第十一届蓝桥杯省赛第二场C/C++ B组题解_第8张图片题意

输入一个日期,该日期为8位数字,需要输出下一个符合条件的回文日期与一个即为回文日期也是ABABBABA形式的回文日期。

思路

将输入的日期进行进行自加,并且判断是否为闰年与日期是否为正确日期。判断结束后将日期进行拆分为8位数字,存入数组中,如果a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4]满足回文,在满足回文的条件下如果**a[0]==a[2]&&a[1]==a[3]&&a[0]!=a[1]**满足ABABBABA形式的回文。具体请看代码。

代码

#include
using namespace std;
int d[13]={
     0,31,28,31,30,31,30,31,31,30,31,30,31};
bool runyears(int year)//判断是否为闰年
    {
     
        return year%400==0||(year%4==0&&year%100!=0);
    }
bool date(int year,int month,int day)//判断日期是否正确
    {
     
        if(month>12)
        {
     
            return false ;
        }
        if(runyears(year)&&month==2)
        {
     
            return day<=29;
        }return day<=d[month];
    }
int main()
{
     
    bool flag=false;
    int n;
    cin>>n;
    for(int i=n+1;i<89991231;i++)
    {
     
        int a[8];
        for(int j=7,m=i;j>=0;j--,m/=10)
        {
     
            a[j]=m%10;//将日期拆分
        }
        int year=a[0]*1000+a[1]*100+a[2]*10+a[3];
        int month=a[4]*10+a[5];
        int day=a[6]*10+a[7];
        if(!date(year,month,day))//如果日期不正确,则跳过
        {
     continue;
        }
        //判断是否为回文
        if(a[0]==a[7]&&a[1]==a[6]&&a[2]==a[5]&&a[3]==a[4])
        {
     
            if(flag==false)
            {
     
                cout<<i<<endl;
                flag=true;
            }
            //判断是否为ABABBABA形式的回文
            if(a[0]==a[2]&&a[1]==a[3]&&a[0]!=a[1])
            {
     
                cout<<i<<endl;
                break;
            }
        }
    }return 0;
}

H.子串分值和
第十一届蓝桥杯省赛第二场C/C++ B组题解_第9张图片第十一届蓝桥杯省赛第二场C/C++ B组题解_第10张图片第十一届蓝桥杯省赛第二场C/C++ B组题解_第11张图片题意

输入一个字符串,按顺序不断拆分为不同的子字符串,并且计算每一个子字符串中不同字母的个数,并求和输出

思路

使用容器set去重,使用substr函数按顺序截取子字符串。具体操作请看代码。

代码

#include
using namespace std;
int solve(string s)//容器会自动删去重复的字符
{
     
    set<char>st;
    for(int i=0;i<s.size();i++)
    {
     
        st.insert(s[i]);
    }return st.size();//去重后的字符长度
}
int main()
{
     
    int sum=0;
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
     
        for(int j=i;j<s.size();j++)
        {
         string ss=s.substr(i,j-i+1);//字符截取
            sum+=solve(ss);
        }
    }cout<<sum<<endl;
}

** 如果觉得博主写的还不错点个赞吧,比心!**

你可能感兴趣的:(蓝桥杯)