第十一届蓝桥杯C++省赛B组题解(一)

之前发了一篇完整的题解博客,几天之后发现了错误,修改之后居然说我与已有文章高度相似,没办法,只能分开写

门牌制作

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

代码:

#include <iostream>
using namespace std;
int main()
{
    
    
    int n,c=0;
    for(int i=1;i<2021;i++)
    {
    
    
        n = i;
        while(n>0)
        {
    
    
            if(n%10 == 2)
                c++;
            n /= 10;
        }
    }
    cout << c;
    return 0;
}

既约分数

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

#include <iostream>
using namespace std;
int gcb(int a,int b)
{
    
    
    if(b == 0)
        return a;
    else
        return gcb(b,a%b);
}

int main()
{
    
    
    int c=0;
    for(int i=1;i<2021;i++)
    {
    
    
        for(int j=1;j<2021;j++)
        {
    
    
            if(gcb(i,j) == 1)
                c++;
        }
    }
    cout << c;
    return 0;
}

蛇形填数

题目: 如下图所示,小明用从1开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 …
3 5 8 14 …
4 9 13 …
10 12 …

容易看出矩阵第二行第二列中的数是5。请计算出矩阵第20行第20列的数是多少?

答案: 761
代码:

//方法一:根据蛇形的走向找规律,代码较为复杂
#include <iostream>
using namespace std;
int arr[1000][1000];
bool check(int i,int j)
{
    
    
    if(i==19 && j==19)
        return true;
    else
        return false;
}
int main()
{
    
    

    int n=1,i=0,j=0;
    arr[i][j] = n;
    n++;
    while(1)
    {
    
    
        arr[i][++j] = n;
        if(check(i,j))
            break;
        n++;

        while(j>0)
        {
    
    
            arr[++i][--j] = n;
            if(check(i,j))
                break;
            n++;
        }
        if(check(i,j))
            break;
        arr[++i][j] = n;
        if(check(i,j))
            break;
        n++;
        while(i>0)
        {
    
    
            arr[--i][++j] = n;
            if(check(i,j))
                break;
            n++;
        }
        if(check(i,j))
            break;
    }
    
    cout << n;

    return 0;
}

//方法二:找出第n行第n列的值的联系
//(1,1)=1;(2,2)=5;(3,3)=13;(4,4)=25;(5,5)=41
#include <iostream>

using namespace std;

int main()
{
    
    
    int n=1,i=1;
    while(i<20)
    {
    
    
        n +=4*i;
        i++;
    }
    cout << n;
    return 0;
}

跑步锻炼

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

答案: 8879
代码:

#include <iostream>
using namespace std;

bool LeapYear(int year)
{
    
    
    if((year%400==0)||(year%4==0 && year%100!=0))
        return true;
    else
        return false;
}

int main()
{
    
    
    int year=2000,month=1,day=1;
    int week=6,sum=0;
    int m[13] = {
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};

    while(1)
    {
    
    
        if(LeapYear(year))
            m[2] = 29;
        else
            m[2] = 28;
        if(day==1 || week==1)
            sum += 2;
        else
            sum += 1;
        if(year==2020 && month==10 && day==1)
            break;
        //cout << year << "年 " << month << "月 " << week << endl;
        day += 1;
        if(day > m[month])
        {
    
    
            day = 1;
            month += 1;
        }
        if(month > 12)
        {
    
    
            month = 1;
            year += 1;
        }
        if(week+1 == 8)
            week = 1;
        else
            week += 1;
    }
    cout << sum ;

    return 0;
}

Guess you like

Origin blog.csdn.net/weixin_43790779/article/details/115239154