C++蓝桥杯中级模拟测试
没有什么技术上的难题,主要考察学生编程实现时在语句和语法方面的熟练度。
第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;
}

添加 家长论坛微信
全部 0条评论