[蓝桥杯 2017 省 B] 日期问题
题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日
的,有采用月/日/年
的,还有采用日/月/年
的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
比如 02/03/04
,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日或 2004 年 03 月 02 日。
给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
输入格式
一个日期,格式是 AA/BB/CC
。(0≤A,B,C≤9)
输出格式
输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd
。多个日期按从早到晚排列。
输入输出样例
输入 #1 02/03/04
输出 #1
2002-03-04
2004-02-03
2004-03-02
代码及思路
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; //判断闰年 bool leapyear(int year) { if(year%100!=0&&year%4==0)return true; if(year%400==0)return true; return false; } //每个月有多少天 int monthdays(int year,int month) { int day=0; if(month==2) { if(leapyear(year))day=29; else day=28; } else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)day=31; else if(month==4||month==6||month==9||month==11)day=30; else return 0; return day; } //打印函数 void printdate(int year,int month,int day) { if(year<100&&year>=60)year=1900+year; if(year>=0&&year<60)year=2000+year; //计算月的最大天数 int monthday=monthdays(year,month); if(month>0&&month<10) { if(day>0&&day<=monthday) { if(day>0&&day<10)cout<<year<<"-0"<<month<<"-0"<<day<<endl; else cout<<year<<"-0"<<month<<'-'<<day<<endl; } } else if(month<13&&month>9) { if(day>0&&day<=monthday) { if(day>0&&day<10)cout<<year<<"-"<<month<<"-0"<<day<<endl; else cout<<year<<'-'<<month<<'-'<<day<<endl; } } else return; } int main() { string arr; cin>>arr; int a=(arr[0]-48)*10+(arr[1]-48); int b=(arr[3]-48)*10+(arr[4]-48); int c=(arr[6]-48)*10+(arr[7]-48); //保持顺序,也就是数值大的后打印 if(a>c) { if(a>b) { printdate(c,b,a); printdate(c,a,b); } else if (a==b)printdate(c,a,b); else { printdate(c,a,b); printdate(c,b,a); } printdate(a,b,c); } else if(a==c) { if(a>b) { printdate(c,b,a); printdate(c,a,b); } else if(a==b)printdate(a,b,c); else { printdate(c,a,b); printdate(c,b,a); } } else//a<c { printdate(a,b,c); if(a>b) { printdate(c,b,a); printdate(c,a,b); } else if (a==b)printdate(c,a,b); else { printdate(c,a,b); printdate(c,b,a); } } return 0; }
[蓝桥杯 2021 省 B] 时间显示
题目描述
小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从 1970 年 1 月 1 日 00:00:00 到当前时刻经过的毫秒数。
现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日,只需要 显示出时分秒即可,毫秒也不用显示,直接舍去即可。
给定一个用整数表示的时间,请将这个时间对应的时分秒输出。
输入格式
输入一行包含一个整数,表示时间。
输出格式
输出时分秒表示的当前时间, 格式形如 HH:MM:SS, 其中 HH 表示时, 值 为 00 到 23,MM 表示分。值为 00 到 59。SS 表示秒, 值为 00 到 59。时、分、秒不足两位时补前导 0
。
输入输出样例
输入 #1 46800999
输出 #1 13:00:00
输入 #2 1618708103123
输出 #2 01:08:23
说明/提示
对于所有评测用例, 给定的时间为不超过 的正整数。
蓝桥杯 2021 第一轮省赛 B 组 F 题。
代码及思路
#include<iostream> using namespace std; int main() { long long int time=0; cin>>time; int s,m,h,num; time/=1000;//将毫秒化为秒 num=time%86400;//将秒归到一天之内 h=num/3600;//这个秒里面有几个小时 num%=3600; m=num/60; num%=60; s=num; printf("%02d:%02d:%02d",h,m,s); return 0; }