1229. 日期问题
题意描述:
方法一:
优点:容易理解,容易想出;
缺点:需要debug,代码较多;
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int days[]={0,31,0,31,30,31,30,31,31,30,31,30,31};
struct node{
int year,mou,day;
}ans[4];
bool cmp(node a,node b){
if(a.year != b.year ) return a.year < b.year ;
if(a.mou != b.mou ) return a.mou <b.mou ;
return a.day <b.day ;
}
bool check(int year, int mou ,int day)
{
if(mou<1||mou>12) return false;
if(day<1||day>31) return false;
if((year%4==0&&year%100!=0)||year%400==0) {
if(mou==2 && day<=29) return true;
}
else if(mou==2 && day<=28) return true;
if(day<=days[mou]) return true;
return false;
}
int main()
{
int a,b,c;
scanf("%2d/%2d/%2d",&a,&b,&c);
int k=0;
if(a>=60){
if(check(a+1900,b,c)) ans[k].year = a+1900,ans[k].mou =b,ans[k++].day = c;
}
else if(check(a+2000,b,c)) ans[k].year = a+2000,ans[k].mou =b,ans[k++].day = c;
if(c>=60) {
if( a!=c && check(c+1900,a,b)) ans[k].year = c+1900,ans[k].mou =a,ans[k++].day = b;
if(a!=b && check(c+1900,b,a)) ans[k].year = c+1900,ans[k].mou =b,ans[k++].day = a;
}
else {
if(a!=c && check(c+2000,a,b)) ans[k].year = c+2000,ans[k].mou =a,ans[k++].day = b;
if(a!=b && check(c+2000,b,a)) ans[k].year = c+2000,ans[k].mou =b,ans[k++].day = a;
}
sort(ans,ans+k,cmp);
for(int i=0;i<k;i++)
printf("%d-%02d-%02d\n",ans[i].year ,ans[i].mou ,ans[i].day );
return 0;
}
方法二:
优点:出错率低,较易调试,代码好写;
#include<bits/stdc++.h>
using namespace std;
int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year, int month, int day)
{
if (month == 0 || month > 12) return false;
if (day == 0) return false;
if (month != 2)
{
if (day > days[month]) return false;
}
else
{
int leap = year % 100 && year % 4 == 0 || year % 400 == 0;
if (day > 28 + leap) return false;
}
return true;
}
int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
for(int i=19600101;i<=20591231;i++) //核心操作;
{
int year=i/10000,month=i%10000/100,day=i%100;
if(check(year,month,day))
{
if(year%100==a && month ==b &&day==c ||
month==a && day==b&& year%100==c ||
day==a && month==b && year%100==c)
printf("%d-%02d-%02d\n",year,month,day);
}
}
return 0;
}