C++蓝桥杯中级模拟测试

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 71 浏览





没有什么技术上的难题,主要考察学生编程实现时在语句和语法方面的熟练度。

第1题 拉线开关

题目描述

小蓝家的灯是拉线式开关的,拉一次灯开,再拉一次灯关,未拉之前灯是熄灭状态。

输入一个正整数 M(1<M<100),作为小蓝拉动开关的次数,判断拉动 M 次后,灯是点亮状态还是熄灭状态。

输入

输入一个正整数 M 作为拉动开关的次数(1<M<100)。

输出

如果灯是点亮状态输出整数“1”,如果灯是熄灭状态输出整数“0”。

样例输入

5

样例输出

1

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    if(n%2)
    {
        cout<<1;
    } else {
        cout<<0;
    }
    return 0;
}

第2题 数字组合

题目描述

用户输入一个正整数 N(3<=N<=9)。从 0 到 N 之间的所有正整数(包含 0 和 N)中选择三个,组成一个三位数(0 不能作为百位数),且这个三位数为奇数,请计算出共有多少种满足条件的三位数组合。(注意:组成的三位数各位上的数字不能重复)。

输入

输入一个正整数 N(3<=N<=9)。

输出

输出满足条件的三位数组合的个数。

样例输入

3

样例输出

8

#include <iostream>
using namespace std;
int main()
{
    int n, s=0;
    cin>>n;
    for(int i=1; i<=n; i+=2)
    {
        for(int j=0; j<=n; j++)
        {
            if(j==i)
            {
                continue;
            }
            for(int k=1; k<=n; k++)
            {
                if(k==i || k==j)
                {
                    continue;
                }
                s++;
            }
        }
    }
    cout<<s;
    return 0;
}

第3题 报数模拟

题目描述

有 n 个人围成一个圈,从 1 到 n 按顺序排好号。然后从第一个人开始顺时针 报数(从 1 到 3 报数),报到 3 的人退出圈子后,后面的人继续从 1 到 3 报 数,直到留下最后一个人游戏结束,问最后留下的是原来第几号。

输入

输入一个正整数 n(4<n<600)

输出

输出最后留下的人,原来的编号是多少?

样例输入

5

样例输出

4

#include <iostream>
using namespace std;
int id=1;
void count(int n)
{
    id++;
    if(id>n)
    {
        id-=n;
    }
}
int main()
{
    int n, t, a[600];
    cin>>n;
    t=n;
    for(int i=1; i<=n; i++)
    {
        a[i]=1;
    }
    while(t!=1)
    {
        int i=0;
        while(1)
        {
            while(a[id]==0)
            {
                count(n);
            }
            i++;
            if(i==3)
            {
                a[id]=0;
                count(n);
                break;
            } else {
                count(n);
            }
        }
        t--;
    }
    while(a[id]==0)
    {
        count(n);
    }
    cout<<id;
    return 0;
}

第4题 算天数

题目描述

假设今天是2022年12月18日,用户输入未来的某一天,输入格式为如 2022 12 19。

编程计算这一天和今天相差多少天?(例如:今天和明天是相差一天)

星期几?(注意:输出格式为 星期的数字值并在其前加“*”)。

输入

按要求输入未来某一天。

输出

第一行输入一正整数表示今天和未来一天相差的天数,第二行输 入未来的一天星期几且在星期前加“*”。

样例输入

2022 12 19

样例输出

1

*1

提示

闰年分为普通闰年和世纪闰年。

普通闰年:公历年份是 4 的倍数,且不是 100 的倍数,为普通闰年。(如 2004 年就是普通闰年)。

世纪闰年:公历年份是整百数的,必须是 400 的倍数才是世纪闰年(如 1900 年不是世纪闰年,2000 年是世纪闰年)。

所以有人将此规则总结为:四年一闰,百年不闰,四百年再闰。

闰年的一年为 366 天,闰年的二月份为 29 天。平年一年为 365 天,平年的二 月为 28 天。每年的 1、3、5、7、8、10、12 月份为 31 天,4、6、9、11 月份为 30 天。

#include <iostream>
using namespace std;

bool judge(int year)
{
    if(year%4==0 && year%100!=0 || year%400==0)
    {
        return 1;
    } else {
        return 0;
    }
}
int main()
{
    int y, m, d, n, x, total=0, weekday;
    cin>>y>>m>>d;
    n=y-2022;
    if(n==0)
    {
        total=d-18;
        weekday=total%7?total%7:7;
        cout<<total<<endl<<'*'<<weekday;
        return 0;
    }
    total=31-18;
    for(int i=1; i<=n; i++)
    {
        if(i!=n)
        {
            x=13;
        } else {
            x=m;
        }
        if(judge(2022+i))
        {
            for(int j=1; j<x; j++)
            {
                if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)
                {
                    total+=31;
                } else if(j==4 || j==6 || j==9 || j==11) {
                    total+=30;
                } else if(j==2) {
                    total+=29;
                }
            }
        } else {
            for(int j=1; j<x; j++)
            {
                if(j==1 || j==3 || j==5 || j==7 || j==8 || j==10 || j==12)
                {
                    total+=31;
                } else if(j==4 || j==6 || j==9 || j==11) {
                    total+=30;
                } else if(j==2) {
                    total+=28;
                }
            }
        }
    }
    total+=d;
    weekday=total%7?total%7:7;
    cout<<total<<endl<<'*'<<weekday;
    return 0;
}

第5题 标记门牌号

题目描述

一家酒店有 F 层高(0<F<100),每层都有 n 个房间(0<n<100),房间门牌号由不少于 3 位的数字组成:后两位是房间号,从 1 开始,不间断地排到 n,不足两位的前面补零;前面一或两是楼层号,从 1 开始,不间断地排到 F,前面不补零。如 1 楼第 8 个房间门牌号是 108,12 楼第 16 个房间门牌号是 1216。

现在要为每个房间制作一个门牌号码的金属牌,每个金属牌都要定制模具,数字居中显示。但如果某房间门牌上下颠倒过来的号码与原号码一模一样,就需要做一个特殊记号,以免混淆方向。

例如:8008、1691、6119、818、619 等等。

因为数字 6 倒过来是 9;9 倒过来是 6;0、1、8 倒过来还是原数;其他数字倒过来不构成数字。对于多位数 618,倒过来看应该是 819,与原来不一样,就不用做记号了。

输入楼层数 F 和房间数 n,计算有多少房间的门牌号码需要做特殊记号。

输入

输入两个正整数 F(0<F<100)和 n(0<n<100)中间一个空格隔开,代表酒店的楼层数和每层房间数。

输出

输出需要做特殊记号的门牌数。

样例输入

2 5

样例输出

1

#include <iostream>
using namespace std;
int change(int n)
{
    switch(n)
    {
        case 0:
            return 0;
        case 1:
            return 1;
        case 6:
            return 9;
        case 8:
            return 8;
        case 9:
            return 6;
        default:
            return -1;
    }
}
bool judge(int n)
{
    int s=0, t=n, v;
    while(t)
    {
        v=change(t%10);
        if(v==-1)
        {
            return 0;
        } else {
            s=s*10+v;
            t/=10;
        }   
    }
    if(n==s)
    {
        return 1;
    } else {
        return 0;
    }
}

int main()
{
    int f,n,total=0;
    cin>>f>>n;
    for(int i=1; i<=f; i++)
    {
        for(int j=1; j<=n; j++)
        {
            if(judge(i*100+j))
            {
                total++;
            }
        }
    }
    cout<<total;
    return 0;
}

图片


添加 家长论坛微信 



发布于 2024-04-26 18:25

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2