P8651日期问题
题目
分析
假设日期年月日为a、b、c
- 注意各个数字的范围:a>=1960,a<2060,b>=1,b<=12,c>=1
- 读入的数据可能是年/月/日、月/日/年、日/月/年
- 区分闰年时二月份的不同
- 相同的日期不能重复输出
- 有多种结果时,日期从早到晚排列
- 输入的年份只有后半部分,若要实现顺序排列最好的办法是在输入时将前缀加上。比较年、月谁在先后。
代码主要解决的问题分为三部分:
输出函数:控制输出年/月/日、月/日/年、日/月/年,用于随时调用保证日期的顺序性
检查函数:检查日期的合法性
主函数:做输入以及主逻辑的内容(不要忘记了判重)
代码
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
bool check(int a,int b,int c){
if(c<=0)return 0;
//大月
if(b==1 || b==3 || b==5 || b==7 || b==8 || b==10 || b==12){
if(c<=31)return 1;
}
if(b==4 || b == 6 || b== 9 || b == 11){
if(c<=30)return 1;
}
if(b == 2){
if(a%4 == 0){
if(c<=29)return 1;
}else{
if(c<=28)return 1;
}
}
return 0;
}
void print_ans(int n){
switch (n) {
case 1:
//年/月/日
if(check(a,b,c))printf("%d%02d-%02d-%02d\n",a>=60?19:20,a,b,c);
break;
case 2:
//月/日/年
if(check(c,a,b))printf("%d%02d-%02d-%02d\n",c>=60?19:20,c,a,b);
break;
case 3:
//日/月/年
if(check(c,b,a))printf("%d%02d-%02d-%02d\n",a>=60?19:20,c,b,a);
break;
}
}
int main(){
scanf("%d/%d/%d",&a,&b,&c);;
if(a<60)a+=100;
if(c<60)c+=100;//更改大小,便于比较
if(a<c){//a比c年份大
a %= 100;
c %= 100;//还原
print_ans(1);//a年份小,先输出
//再输入年份大的c,先比较ab,小的作为月份。
if(a<b){
if(c!=a || a!=b || b!=c){//如果三个互不相等,则可以输出
print_ans(2);
if(b!=a)print_ans(3);//再判断月日是否相等
}
}else{
if(c!=a){
print_ans(3);
if(b!=a)print_ans(2);//再判断月日是否相等
}
}
}else{//c比a年份大
a %= 100;
c %= 100;//还原
//再输入年份大的c,先比较ab,小的作为月份。
if(a<b){
if(c!=a || a!=b || b!=c){//如果三个互不相等,则可以输出
print_ans(2);
if(b!=a)print_ans(3);//再判断月日是否相等
}
}else{
if(c!=a){
print_ans(3);
if(b!=a)print_ans(2);//再判断月日是否相等
}
}
print_ans(1);//最后输出a
}
return 0;
}