蓝桥杯 C++项目题库4

2.5 ***第十二届蓝桥杯青少组 stema 选拔赛中级组 2021 年 8 月
2.5.1 蜗牛爬井
一只蜗牛从 15 米深的井底向井口爬,白天爬 3 米,晚上向下滑落 1 米,第二天白
天爬 3 米,晚上再滑落 1 米,问按照这样的规律,蜗牛多少天可以爬到井口?
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<(n-3)/(3-1)+1;
return 0;
}
2.5.2 判断三角形
给定三个正整数,分别表示三条线段的长度,判断这三条线段能否构成一个三角
形。 输入输入共一行,包含三个正整数,分别表示三条线段的长度,数与数之间以
一个空格分开。 输出如果能构成三角形,则输出“yes” ,否则输出“no”。
样例输入:3 4 5
样例输出:Yes
#include<iostream>
using namespace std;
int main() {
int a,b,c;
cin>>a>>b>>c;
if(a+b>c&&a+c>b&&b+c>a) //任意两条边之和都大于第三边
第 69 页 共 256 页
cout<<"yes";
else
cout<<"no";
return 0;
}
2.5.3 特殊的秒表
有两个特殊的秒表表。A 秒表一圈有 18 个刻度(指针转一圈为 18 秒),B 秒表
一圈有 27 个刻度(指钟转一圈为 27 秒),A、B 秒表初始位置指针分别指向刻度 13
和 27。
同时按下两块秒表的开始按钮,两块秒表指针同时开始顺时针转动, 每秒走一个
刻度,指针会持续转动。当 A 表转了 n 圈时, 那在 n 圈中 A、B 秒表指针同时指向
相同刻度值的次数有多少次?
如 A 秒表转了 1 圈时 A、B 秒表同时指向相同刻度值为 1,2,3,4,5,6,7,
8,9,10,11,12,13,14, 15,16,17,18。故有 18 次。
输入一个正整数 n(0<n<10^10)表示 A 秒表转动的圈数, 输出一个整数,表示在
n 圈中 A、B 秒表指针同时指向相同刻度值的次数。
#include<iostream>
using namespace std;
int main() {
long long n;
int a = 13, b = 27, count = 0;
cin >> n;
for (int i = 1; i <= n * 18; i++) {
a++;
b++;
if (a % 18 == 0) a = 18;
else a = a % 18;
if (b % 27 == 0) b = 27;
else b = b % 27;
if (a == b) {
count++;
}
}
cout << count;
return 0;
}
第 70 页 共 256 页
2.6***第十三届蓝桥杯青少年C++中级21年11月选拔赛
2.6.1 A+B 问题
给定两个整数 A 和 B,输出 A+B 的值。保证 A、B 及结果均在整型范围内。现在请你
解决这一问题。
输入描述∶ 一行,包含两个整数 A,B,中间用单个空格隔开。A 和 B 均在整型范围
内。
输出描述∶一个整数,即 A+B 的值。保证结果在整型范围内。
样例输入∶1 2
样例输出∶3
#include<iostream>
using namespace std;
int main()
{
long long a,b; //注意数据范围 尽量用 long long
cin>>a>>b;
cout << a+b << endl;
return 0;
}
2.6.2 统计数字
输入一段英文(包含英文字母和数字),统计出这段字符串共有多少个数字字符。输
入描述∶输入一段英文字符串(字符串长度< 3 * 10^4)。
输出描述∶数字字符的个数
样例输入∶a1b2c3
样例输出∶3
方法一:字符数组
#include<iostream>
#include<cstring> //strlen( ) 函数使用此文件头
using namespace std;
char s[30010];
int cnt;
int main()
{
第 71 页 共 256 页
cin >>s;//遇到空格或者换行符就停止
int len=strlen(s);//求长度,strlen== string length
for(int i= 0; i < len; i++)
if(s[i] >='0'&& s[i]<= '9')
cnt++;
cout << cnt << endl;
return 0;
}
方法二:声明字符串
#include<iostream>
#include<cstring> //strlen( ) 函数使用此文件头
using namespace std;
string s;
int cnt;
int main()
{
cin >>s;//遇到空格或者换行符就停止
int len=s.length();//求长度 s.size()
for(int i= 0; i < len; i++)
if(s[i] >='0'&& s[i]<= '9')
cnt++;
cout << cnt << endl;
return 0;
}
2.6.3 班级排列
要拍一个班级照,现在要让男生从低到高排列,女生从高到低排列。输入 10 个学生
的身高信息,然后下一排输入男生女生的信息,男生是 1,女生是 2. 输入描述∶第一排输入 10 个学生的身高,带小数;第二排输入 10 个男女生信息,男
生为 1,女生为 2;
输出描述∶按要求排序后的身高,用空格隔开,身高保留两位小数。
样例输入∶
1.58 1.70 1.71 1.63 1.81 1.55 1.50 1.53 1.74 1.61
2 1 1 2 1 2 2 2 1 1
第 72 页 共 256 页
样例输出∶
1.61 1.70 1.71 1.74 1.81 1.63 1.58 1.55 1.53 1.50
解题思路:模拟法 声明三个数组 分别存储男女混合临时身高、男生身高和女生身高
读入身高数据 并根据男生还是女生存储到相应数组里 使用数组排序 然后输出。
#include<iostream>
#include<algorithm>
using namespace std;
int b=0,g=0,i,t;
float boy[10],girl[10],temp[10]; //存放读入的数据
int main()
{ for(i=0;i<10;i++)
cin>>temp[i];
for(i=0;i<10;i++)
{
cin>>t;
if(t==1) boy[b++]=temp[i];
else girl[g++]=temp[i];
}
sort(boy,boy+b); //数组排序函数 sort()默认升序
sort(girl,girl+g);
for(int i= 0; i < b; i++)
printf("%0.2f ",boy[i]); //要求保留两位小数 注意避坑
for(int i= 0; i < g; i++)
printf("%0.2f ",girl[g-1-i]); //倒序输出
return 0;
}
2.6.4 铺地砖
在 2*n 的一个长方形方格,用一个 1*2 的骨牌铺满方格。
编写一个程序,试对给出的任意一个 n(n>0),输出铺法总数。
输入描述∶输入 n,n 小于等于 20
第 73 页 共 256 页
输出描述∶输出铺法总数
样例输入∶3
样例输出∶3
解题分析:用模拟的方法 计算 n 等于 1 2 3 4 5 6 的情况 会发现输出结果符
合斐波那契数列的规律。然后用递归或者枚举方式解题即可。
#include<iostream>
using namespace std;
long long a[30]={0,1,2};
int n;
int main()
{
cin >>n;
for(int i=3;i<=n; i++)
a[i]= a[i-1]+ a[i-2];
//for(int i=1;i<=n; i++)
// cout<<a[i]<<" "; 用于测试看是否是斐波那契数列
cout<<a[n]<<endl;
return 0;
}
2.6.5 新冠病毒
疫情期间,有些人打了疫苗,在表格中表示为 O,有些人感染了病毒,在表格中表示
为 X,还有些人没有打疫苗,在表格中表示为 P。
新冠病毒会传染,没有打疫苗的人都会被传染,有病毒的人 1 分钟会传染周围上下左
右的 4 个人。最后输出有多少人感染了病毒。打了疫苗的人不会被感染。
输入描述∶第一行输入 2 个正整数 n 和 m(2<n,m<30)表示一个 n*n 的表格,过了 m
分钟的时间。
接下来 n 行,每行 n 个字母,仅包含 O、P、X,分别表示打了疫苗的人,没打疫苗的
人,有新冠病毒的人。
输出描述∶输出一个数字,表示 m 分钟后会有多少人感染新冠病毒。
样例输入∶4 3
P P P X
P O P P
P P P P
P O P X
第 74 页 共 256 页
样例输出∶11
#include<iostream>
#include<cstring> //memset( )函数使用
using namespace std;
char a[40][40];
int n, m, v[40][40];
int main() {
cin >> n >> m; //n*n 的矩阵,m 轮
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j]; //进行 m 轮的传染
while (m--) {
memset(v, 0, sizeof(v));
//将 v 所指向的某一块内存中的每个字节的内容全部设置为 ch 指定的 ASCII 值
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) {
if (a[i][j] == 'X' && v[i][j])
if (a[i - 1][j] == 'P') {
a[i - 1][j] = 'X';
v[i - 1][j] = 1;
}
if (a[i + 1][j] == 'P') {
a[i + 1][j] = 'X';
v[i + 1][j] = 1;
}
if (a[i][j + 1] == 'P') {
a[i][j + 1] = 'X';
v[i][j + 1] = 1;
}
if (a[i][j - 1] == 'P') {
a[i][j - 1] = 'X';
v[i][j - 1] = 1;
}
}
}
int cnt = 0;
第 75 页 共 256 页
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (a[i][j] == 'X')
cnt++;
cout << cnt << endl;
return 0;
}
#include<iostream>
using namespace std;
char a[30][30];
int n, m, i, j;
int main() {
cin >> n >> m; //n*n 的矩阵,m 轮
for ( i = 0; i < n; i++)
for (j = 0; j < n; j++)
cin >> a[i][j];
for (int k = 1; k <= m; k++) {
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) {
if (a[i][j] == 'X' ) {
if (i - 1 >= 0 && a[i - 1][j] == 'P') {
a[i - 1][j] = 'X';
}
if (i + 1 < n && a[i + 1][j] == 'P') {
a[i + 1][j] = 'X';
}
if (j - 1 >= 0 && a[i][j - 1] == 'P') {
a[i][j - 1] = 'X';
}
if (j + 1 < n && a[i][j + 1] == 'P') {
a[i][j + 1] = 'X';
}
}
}
}
第 76 页 共 256 页
int cnt = 0;
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
if (a[i][j] == 'X')
cnt++;
cout << cnt << endl;
return 0;
}
2.7***第十四届蓝桥杯青少年 C++中级 22 年 8 月选拔赛
2.7.1 个位数
给定一个正整数 N(10<N<1000)。输出正整数个位上的数字。
输入描述
输入一个正整数 N(10<N<1000)
输出描述
输出正整数 N 个位上的数字
样例输入 123
样例输出 3
2.7.2 判断数字
给定一个正整数 N(100<=N<100000),统计出 100 到 N(包含 100 和 N)之间的
正整数中,有多少个正整数满足以下条件∶
1)正整数个位数不为 3;
2)正整数十位数不为 5;
3)正整数百位数不为 7。
输入描述
输入一个正整数 N(100≤N<10000)
输出描述
输出 100 到 N(包含 100 和 N)之间有多少个正整数满足条件
样例输入 110
样例输出 10
#include <bits/stdc++.h>
using namespace std;
int main()
第 77 页 共 256 页
{
int n,sum=0;
cin>>n;
for(int i=100;i<=n;i++)
{
if(i%10!=3&&i/10%10!=5&&i/100%10!=7)
sum++;
}
cout<<sum;
return 0;
}
2.7.3 去重
给定一个长度小于 200 的字符串 S.且字符串中只包含小写字母,然后按照以下要
求对字符串 S 进行去重,并输出去重后的字符串。
要求∶
1)如果有重复出现的字母,只保留 1 个,其他的去掉∶
2)不得改变各字母相对位置;
3)保证去重后的字符串的字典序最小。
提示信息:字典序大小,是指字符串中字母在字母表中的先后顺序,即字母表中越靠
前的字母,字典序越小。
例如∶两个字符串 acd 和 cad,两个字符串的第一个字母分别为"a"和 c",其中"a"在字
母表中排在"c"的前边,故字符串 acd 字典序小于字符串 cad,假如第一个字母相同. 就比较第二个字母.以此类推. 输入描述
输入一个长度小于 200 的字符串 S.且字符串中只包含小写字母
输出描述
按照要求对字符串 S 进行去重,并输出
样例输入 cdacd
样例输出 acd
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s; bool flag=0;
int cnt=1;
第 78 页 共 256 页
getline(cin,s);
int a=s.size();
char c[a];
c[0]=s[0];
for(int i=1;i<a;i++)
{
for(int j=0;j<cnt;j++)
if(s[i]==c[j])
{
flag=1;break;
}
if(flag==0) c[++cnt]=s[i];
}
for(int i=0;i<cnt;i++)
cout<<c[i];
return 0;
}
#include <iostream>
using namespace std;
int main() {
string str;
string output;
bool flag = true;
cin >> str;
for (int i = 0; i < str.size(); i++) {
flag = true;
for (int j = 0; j < output.size(); j++) {
if (output[j] == str[i]) {
flag = false;
break;
}
}
if (flag) {
output += str[i];
}
}
cout << output << endl;
}
第 79 页 共 256 页
2.7.4 路径最小和
有一个 N-M 的矩阵方格,每个方格中都有一个正整数。现从左上角方格出发向右
下角方格移动,每次只能向下或向右移动一个方格.请你找出一条最小路径.并输出该
路径上的正整数之和。
最小路径∶这条路径上的正整数之和最小。
例如∶
N=2,M=3,2*3 的矩阵方格中的正整数如下:
1 3 5
2 4 6
按照移动规则,从左上角方格移动到右下角方格的路径共 3 条,分别为 1->3->5->6. 1->3->4->6,1->2->4->6,3 条路径上的正整数之和分别为 15、14 和 13,其中正整数
之和最小的一条路径是 1->2->4->6.和为 13.故输出 13。
输入描述
第一行输入两个正整数 N 和 M(2ENE100.2EME100)。N 表示矩阵方格的行数。M 表
示矩阵方格的列数,两个正整数之间以一个空格隔开
第二行开始输入 N 行,每行 M 个正整数(1 每正整数=200)。正整数之间以一个空
格限开
输出描述
输出一个整数,表示最小路径上的正整数之和
样例输入
23 135 246 样例输出 13
第二行开始输入 N 行,每行 M 个正整数(1<=正整数<=200)。正整数之间以一个空
格隔开
输出描述
输出一个整数,表示最小路径上的正整数之和
样例输入
2 3
1 3 5
2 4 6
样例输出
13
2.7.5 操作字符串
给定两个字符串 S1 和 S2(1<S1 长度<100,1<S2 长度<100),然后按照以下三种
操作,将 S1 转为 S2,问最少操作几次可以完成。
对字符串可进行以下三种操作∶
1)插入一个字符;
第 80 页 共 256 页
2)删除一个字符;
3)修改一个字符。
例如:
S1=abcd,S2=ebde,S1 转为 S2 最少需要操作 3 次,
第一次操作∶将 abcd 中的字符 a 修改成 e,修改后为 ebcd;
第二次操作∶将 ebcd 中的字符 c 删除,删除后为 ebd;
第三次操作∶将 e 插入 ebd 末尾,完成 ebde;
3 蓝桥杯白皮书 C++ 编程题模拟题
3.1 ***白皮书初级组 1
3.1.1 做统计
输入 10 个正整数,以空格分隔。依次输出其中的最大值、最小值以及平均值,
以逗号分隔。
样例输入:
10
1 2 3 4 5 6 7 8 9 10
样例输出:
10,1,5.5
方法一:打擂法
#include<iostream>
using namespace std;
int main()
{
int i,min,max,sum=0,temp,n;
cin>>n;
cin>>temp;
min=max=temp;
for(i=2;i<=n;i++)
{
cin>>temp;
if(temp<min) min=temp;
if(temp>max) max=temp;
sum=sum+temp;
}
第 81 页 共 256 页
cout<<max<<","<<min<<","<<sum*1.0/n;
return 0;
}
方法二:数组排序
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int i,n;
long long sum;
int main()
{
cin>>n;
int a[n];
for(i=0;i<n;i++)
{
cin>>a[i];
sum=sum+a[i];
}
sort(a,a+n);
cout<<a[n-1]<<","<<a[0]<<",";
printf("%0.2f\n",sum*1.0/n);
return 0;
}
3.1.2 面积比大小
输入一个正方形的边长(a)及一个长方形的长与宽(b、c),然后比较两个图形
的面积。如果长方形面积大, 输出“RECTANGLE”;如果正方形面积大,输出
“SQUARE”;如果一样大,输出“SAME”。
输入描述:
输入正整数 a、b、c(0 < a、b、c ≤ 1000),分别代表正方形的边长和长方形的
长与宽。
输出描述:
如果长方形面积大,输出“RECTANGLE”;
如果正方形面积大,输出“SQUARE”;
如果一样大, 输出 “SAME”。
第 82 页 共 256 页
样例输入:
5 4 6
样例输出:
SQUARE
45
#include <iostream>
using namespace std;
int main()
{
int a, b, c, s1, s2;
cin >> a >> b >> c;
s1 = a * a;
s2 = b * c;
if (s2 > s1) cout << "RECTANGLE";
if (s1 > s2) cout << "SQUARE" ;
if (s1 == s2) cout << "SAME" ;
return 0;
}
3.1.3 数单词
编程统计输入句子中出现“lanqiao”字样的个数。(注意,“lanqiao”字样可以是不
同大小写字母的组合,例如:LanQIAO、LanQiao 等)
输入描述:
输入一个字符串(0 ≤ 字符串长度 ≤ 100)。
输出描述:
输出该字符串中“lanqiao”字样出现的次数。(注意:“lanqiao”字样可以是不同大
小写字母的组合)
样例输入:
Lanqiaoqingshao,lanqiaojingsai,Lanqiaoceping. 样例输出:
3
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str,t="lanqiao";
第 83 页 共 256 页
cin >> str;
int len = str.size();
for (int i = 0; i < len; i++)
{
str[i] = (char)tolower(str[i]); // 转换成小写字母
}
cout<<str<<endl;
int cnt = 0;
for (int i = 0; i <= len - 7; i++)
{
if (t == str.substr(i, 7))
cnt++;
}
cout << cnt;
return 0;
}
3.1.4 查找路径
有一张 m×n 个小方格的地图,一个机器人位于地图的左上角(如图标记为 Start
的地方),它每步只能向右或者向下移动一格,如果走到右下角的终点(如图标记为
Finish 的地方),有多少种不同的方法?
例如,一个 3×2 的地图,行走的方法数是 3 种,分别是:
右 -> 右 -> 下
右 -> 下 -> 右
下 -> 右 -> 右
输入描述:
两个整数 m (m ≤ 100) 和 n ( n ≤ 100),代表地图的行数和列数。
输出描述:
一个整数,表示行走的方法数。
样例输入:
8 8
样例输出:
3432
第 84 页 共 256 页
#include <iostream>
using namespace std;
const int N = 100;
long long roads[N + 2][N + 2] = {0};
// roads[i][j]: 从起点 (0, 0) 到 (i, j) 的路线总数
int main() {
int m, n;
cin >> m >> n;
// 第 0 行、第 0 列的格子都只有一条路线
for (int i = 0; i < m; i++)
roads[i][0] = 1;
for (int i = 0; i < n; i++)
roads[0][i] = 1;
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++)
roads[i][j] = roads[i - 1][j] + roads[i][j - 1];
cout << roads[m - 1][n - 1] << endl;
return 0; }
3.1.5 最大最小公倍数
已知一个正整数 N,问从 1- (N-1)中任选出三个数,他们的最小公倍数最大可
以为多少。
输入格式
输入一个正整数 N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
#include<iostream>
using namespace std;
int main()
{
第 85 页 共 256 页
long long n,ans;
cin>>n;
if(n%2==1)
ans=n*(n-1)*(n-2);
else {
if(n%3==0)
ans=(n-1)*(n-2)*(n-3);
else
ans=n*(n-1)*(n-3);
}
cout<<ans;
return 0;
}
3.2 ***白皮书中级组 1
3.2.1 拉线开关
小蓝家的灯是拉线式开关的,拉一次灯开,再拉一次灯关,未拉之前灯是熄灭状
态。
输入一个正整数 M(1 < M < 100),作为小蓝拉动开关的次数,判断拉动 M 次
后,灯是点亮状态还是熄灭状态。
输入描述:
输入一个正整数 M 作为拉动开关的次数(1 < M < 100)
输出描述:
如果灯是点亮状态输出整数“1”,如果灯是熄灭状态输出整数“0”。
样例输入:
5
样例输出:
1
#include <iostream>
using namespace std;
int main()
{
int m;
cin >> m;
第 86 页 共 256 页
cout << m % 2 ;
}
3.2.2 数字组合
用户输入一个正整数 N(3<=N<=9)。从 0 到 N 之间的所有正整数(包含 0 和
N)中选择三个,组成一个三位数(0 不能作为百位数),且这个三位数为奇数,请
计算出共有多少种满足条件的三位数组合。(注意:组成的三位数各位上的数字不能
重复)
输入描述:输入一个正整数 N(3<=N<=9)
输出描述:输出满足条件的三位数组合的个数
样例输入:
3
样例输出:
8
上述输入输出样例的进一步解释:
用户输入的正整数,即样例输入为 3,也就是将 0、1、2、3 四个数字进行组合。
符合要求的三位数为:103、123、203、213、201、231、301、321 共 8 个,所以样
例输出为 8。
#include <iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
for (int i = 1; i <= n; ++i) // 百位
for (int j = 0; j <= n; ++j) // 十位
for (int k = 1; k <= n; k += 2) // 个位只能是奇数
if (k != i && k != j&&i != j)
cnt++;
cout << cnt;
return 0;
}
3.2.3 报数模拟
有 n 个人围成一个圈,从 1 到 n 按顺序排好号。然后从第一个人开始顺时针报
数(从 1 到 3 报数),报到 3 的人退出圈子后,后面的人继续从 1 到 3 报数,
直到留下最后一个人游戏结束,问最后留下的是原来第几号。
第 87 页 共 256 页
输入描述:
输入一个正整数 n(4 < n < 600)
输出描述:
输出最后留下的人,原来的编号是多少?
样例输入:
5
样例输出:
4
#include<iostream>
using namespace std;
int main()
{
int n,m,i=1,k=0,j; //K 用来表示报数的数
cin>>n;
int a[n+1]={0}; //对数据进行初始化操作
//通过循环不断淘汰人,直到最后只剩下一个人
while(m < n-1) //淘汰的人数小于 n-1 即不是剩余一个人
{
if(a[i]!=1) k++; //判断该人是否已经淘汰
if(k == 3)
{
a[i]=1; //淘汰报数为 3 的人(即将其值设置为 1)
k=0; //将 k 置为 0,重新报数
m++; //对淘汰人数进行计数
}
i++; //对下一个人进行判断
if(i > n) i=1; //到了圈子的末尾出处,将下一个人置为 1
}
for(j=1;j<=n;j++)
if(a[j]!=1)
{ cout<<j; break; }//只有一个 找到即退出
return 0;
}
3.2.4 算天数
用户输入未来的某一天,输入格式为如 2021 6 1,编程计算这一天和今天相差多
少天?(例如:今天和明天是相差一天)星期几?(注意:输出格式为 星期的数字
第 88 页 共 256 页
值并在其前加“*”)。
样例输入:
2021 6 1
样例输出:
183
*2
闰年分为普通闰年和世纪闰年。
普通闰年:公历年份是 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 isLeap(int y)
{
return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}
int main()
{
int Y_now = 2021, M_now = 1, D_now = 14, W_now = 4; // 今日日期
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
days[2] = 28 + (int)isLeap(Y_now);
int Y_future, M_future, D_future;
cin >> Y_future >> M_future >> D_future;
int y = Y_now, m = M_now, d = D_now, w = W_now;
int cnt = 0;
while (!(y == Y_future && m == M_future && d == D_future))
{
cnt++;
w++;
cout<<y<<'*'<<m<<'*'<<d<<endl;
cout<<"cnt=="<<cnt<<endl;
第 89 页 共 256 页
if (w > 7)
{
w = 1;
}
d++;
if (d > days[m])
{
d = 1;
m++;
if (m > 12)
{
m = 1;
y++;
days[2] = 28 + (int)isLeap(y);
}
}
}
cout << cnt << endl;
cout << '*' << w ;
return 0;
}
第 90 页 共 256 页
3.2.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;
bool check(int num) {
int t[10] = {0, 1, -1, -1, -1, -1, 9, -1, 8, 6};
// i 与 t[i] 互为颠倒
int a = num / 1000; // 千位
int b = num / 100 % 10;
int c = num / 10 % 10;
int d = num % 10; // 个 位
if ((a == 0 && t[b] == d && t[c] == c) || (a != 0 && t[a] == d && t[b] ==
c))
return true;
else
第 91 页 共 256 页
return false;
}
int main() {
int f, n, cnt = 0;
cin >> f >> n;
for (int i = 1; i <= f; ++i)
{
for (int j = 1; j <= n; ++j)
{
int num = i * 100 + j;
if (check(num)) cnt++;
}
}
cout << cnt ;
}

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值