蓝桥杯历年省赛真题
点击链接免费加入题单
日期问题
给定日期问过多少天后日期是多少
星系炸弹 (蓝桥杯C++2015B组省赛)
- 题目描述
在 X X X 星系的广袤空间中漂浮着许多 X X X 星人造“炸弹”,用来作为宇宙中的路标。每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹
2015
2015
2015 年
1
1
1 月
1
1
1 日放置,定时为
15
15
15 天,则它在
2015
2015
2015 年
1
1
1 月
16
16
16 日爆炸。
有一个贝塔炸弹,
2014
2014
2014 年
11
11
11 月
9
9
9 日放置,定时为
1000
1000
1000 天,请你计算它爆炸的准确日期。
请填写该日期,格式为 y y y y yyyy yyyy- m m mm mm- d d dd dd 即 4 4 4 位年份 2 2 2 位月份 2 2 2 位日期。比如: 2015 2015 2015- 02 02 02- 19 19 19。
-
题目答案:2017-08-05
-
题目思路
直接模拟日期的计算与进位,我们假设年份用 y e a r year year 表示,月份用 m o n t h month month 表示,日期用 d a y day day 表示
1.月份进位
(1)小月满31天进1月
(2)大月满32天进1月
(3)2月要分平年闰年,闰年满30天进1月,平年满29天进1月
(4)月份进1之后记得将天数 d a y day day 归1
2.年份进位
月份满13进1年,月份 m o n t h month month 归1
- 题目代码
#include<bits/stdc++.h>
using namespace std;
int m1[] = {0, 1, 3, 5, 7, 8, 10, 12};//数组m1存储大月
int m2[] = {0, 4, 6, 9, 11};//数组m2存储小月
int main() {
int year = 2014, month = 11, day = 9;
for(int i = 1;i <= 1000;i++) {//加1000天
day++;
for(int j = 1;j <= 7;j++) {//判断是否是大月
if(month == m1[j] && day == 32) {//大月满32天进一月
month++;
day = 1;//天数重新回到1号
break;
}
}
for(int j = 1;j <= 4;j++) {//判断是否是小月
if(month == m2[j] && day == 31) {//小月满31天进一月
month++;
day = 1;
break;
}
}
if(month == 2) {//2月单独判断
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//判断是否是闰年
if(day == 30) {//闰年满30进一月
month++;
day = 1;
}
}
else {
if(day == 29) {//平年满29进一月
month++;
day = 1;
}
}
}
if(month == 13) {//满13月进1年
month = 1;//月份回到1月重新计数
year++;
}
}
cout << year << "-" << month << "-" << day;
}
日期与日期之间有多少天
第几天 (蓝桥杯C++2018B组省赛)
- 题目描述
2000 2000 2000 年的 1 1 1 月 1 1 1 日,是那一年的第 1 1 1 天。那么, 2000 2000 2000 年的 5 5 5 月 4 4 4 日,是那一年的第几天?
- 题目答案:125
- 题目思路
如果只是为了应付这道题目计算器或者手算一下都可以,但如果把题目扩展为任意的两个日期之间间隔多少天我们又该如何去做呢。
其实思路也很简单从开始日期一直加1,直到与最终日期相等为止,在上一题的代码基础上略作修改即可
- 代码
#include<bits/stdc++.h>
using namespace std;
int m1[] = {0, 1, 3, 5, 7, 8, 10, 12};//数组m1存储大月
int m2[] = {0, 4, 6, 9, 11};//数组m2存储小月
int main() {
int num = 0;
int year = 2000, month = 1, day = 1;
int year2 = 2000, month2 = 5, day2 = 4;
while(1) {
num++;
day++;
for(int j = 1;j <= 7;j++) {//判断是否是大月
if(month == m1[j] && day == 32) {//大月满32天进一月
month++;
day = 1;//天数重新回到1号
break;
}
}
for(int j = 1;j <= 4;j++) {//判断是否是小月
if(month == m2[j] && day == 31) {//小月满31天进一月
month++;
day = 1;
break;
}
}
if(month == 2) {//2月单独判断
if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//判断是否是闰年
if(day == 30) {//闰年满30进一月
month++;
day = 1;
}
}
else {
if(day == 29) {//平年满29进一月
month++;
day = 1;
}
}
}
if(month == 13) {//满13月进1年
month = 1;//月份回到1月重新计数
year++;
}
if(year == year2 && month == month2 && day == day2) {//到目标日期后跳出循环
break;
}
}
cout << num << endl;
}
日期与分钟之间的转换
纪念日(蓝桥杯C/C++2020B组省赛第一场)
- 题目描述
2020 2020 2020 年 7 7 7 月 1 1 1 日是×××××成立 99 99 99 周年纪念日。
×××××成立于 1921 1921 1921 年 7 7 7 月 23 23 23 日。
请问从 1921 1921 1921 年 7 7 7 月 23 23 23 日中午 12 12 12 时到 2020 2020 2020 年 7 7 7 月 1 1 1 日中午 12 12 12 时一共包含多少分钟?
- 题目答案:52038720
- 题目思路
我们此时计算的不是天数,但我们知道一天有多少分钟,所以累加的时候换成 1440 1440 1440 分钟即可。
-
代码
#include<bits/stdc++.h> using namespace std; int m1[] = {0, 1, 3, 5, 7, 8, 10, 12};//数组m1存储大月 int m2[] = {0, 4, 6, 9, 11};//数组m2存储小月 int main() { int num = 0; int year = 1921, month = 7, day = 23; int year2 = 2020, month2 = 7, day2 = 1; while(1) { num += 24 * 60; day++; for(int j = 1;j <= 7;j++) {//判断是否是大月 if(month == m1[j] && day == 32) {//大月满32天进一月 month++; day = 1;//天数重新回到1号 break; } } for(int j = 1;j <= 4;j++) {//判断是否是小月 if(month == m2[j] && day == 31) {//小月满31天进一月 month++; day = 1; break; } } if(month == 2) {//2月单独判断 if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {//判断是否是闰年 if(day == 30) {//闰年满30进一月 month++; day = 1; } } else { if(day == 29) {//平年满29进一月 month++; day = 1; } } } if(month == 13) {//满13月进1年 month = 1;//月份回到1月重新计数 year++; } if(year == year2 && month == month2 && day == day2) { break; } } cout << num << endl; }
星期与周期性问题
星期计算(蓝桥杯Java2022B组省赛)
- 题目描述
已知今天是星期六,请问 2 0 22 20^{22} 2022 天后是星期几?
注意用数字 1 1 1 到 7 7 7 表示星期一到星期日。
- 题目答案:7
- 题目思路
题目难度不大,我们只需要看一下 $20^{22}\ mod\ 7 $ 之后还剩几天,最后用一个while循环简单算一下即可。注意这题 2 0 22 20^{22} 2022 需要使用大数或者高精度。
- 代码
时间转换
时间显示(蓝桥杯C/C++2021B组省赛)
- 题目思路
只需要利用取余运算即可,我们假设题目输入为 n n n 毫秒
1.首先将 m s ms ms 转化为 s s s, 1 s = 1000 m s 1s = 1000ms 1s=1000ms 所以开始先除以 1000 1000 1000, n = n / 1000 n = n / 1000 n=n/1000。
2.转化成秒之后,先需要对一天有多少秒进行取余,这样剩下的时间肯定不到一天才能进行时间计算,也就是 m o d 86400 mod\ 86400 mod 86400。
3.对一天有多少秒取余后,我们先算还剩下多少小时也就是 n / 3600 n / 3600 n/3600, 然后再 m o d 3600 mod\ 3600 mod 3600 剩下的秒数计算分钟
4.取余后算一下还有多少分钟也就是 n / 60 n / 60 n/60,最后再 m o d 60 mod\ 60 mod 60 输出还剩下多少秒。
- 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int h,m,s;
ll n;
cin >> n;
n = n / 1000 % 86400; // 毫秒化秒,并且保留最后一天天数
h = n / 3600; //求得最后一天的小时
n = n % 3600;
m = n / 60; //分钟
s = n % 60; //秒数
printf("%02d:%02d:%02d",h,m,s); //02d的意思是如果不足俩位数,前补0
return 0;//蓝桥杯编程题最后一定要记得加return 0;
}
回文日期(蓝桥杯C/C++2020B组省赛第二场)
- 题目思路
1.首先要用 for
循环从题目要求的日期开始往后遍历,假设日期为
d
a
t
e
date
date ,把日期先当作数字也就是从
d
a
t
e
+
1
date + 1
date+1 开始往后遍历。
2.然后我们要判断当前日期是否合法,先利用取余与除法分离出 年/月/日
(1) y e a r = d a t e / 10000 year = date/10000 year=date/10000、 m o n t h = d a t e % 10000 / 100 month = date \% 10000 / 100 month=date%10000/100、 d a y = d a t e % 100 day = date \% 100 day=date%100
(2) 月份和天数必须要符号日期格式, 1 ≤ m o n t h ≤ 12 1\leq month \leq 12 1≤month≤12、天数 d a y day day 要根据大小月和 2 2 2 月平闰年判断合法性
3.
- 代码
#include<bits/stdc++.h>
using namespace std;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool check(int date) {
int year = date / 10000;//从date中分离出年
int month = date % 10000 / 100;//从date中分离出月
int day = date % 100;//从date中分离出日
if (!day || month <= 0 || month > 12) return false;//月份和日期为0不合法
if (month != 2 && day > months[month]) return false;//日期不合法
if (month == 2) {//2月单独判断日期是否合法
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {//判断平闰年
if (day > 29) return false;//闰年日期不合法
} else {
if (day > 28) return false;//平年日期不合法
}
}
return true;
}
bool check1(string s) {//判断是否是回文数
int len = s.size();
for (int i = 0, j = len - 1; i < j; i++, j--) {//两个变量当两个指针,一个从头一个从尾用if判断
if (s[i] != s[j]) return false;
}
return true;
}
bool check2(string s) {
if (check1(s)) {//先确定是否是回文数
if (s[0] != s[2] || s[1] != s[3] || s[0] == s[1]) return false;//判断是否是ABABBABA型
return true;
}
return false;
}
int main() {
int date, flag = 0;
cin >> date;
for (int i = date + 1;; i++) {
if (check(i)) {//判断日期是否合法
string s = to_string(i);//判断完后将年月日从数字转化为字符串,方便进行回文判断
if (check1(s) && !flag) {//flag标记避免重复输出
cout << i << endl;
flag = 1;
}
if (check2(s)) {//判断是否是ABABBABA型
cout << i << endl;
return 0;
}
}
}
return 0;
}