日期问题
题目描述
核心思路
按找本题的意思则是abc可能有三种排列方式(年/月/日,月/日/年,日/月/年),在指定区间中寻找并要符合日期条件,则可模拟暴力中找出符合日期条件的数字,并进一步与三种排序顺序的日期进行比对,吻合即输出。
值得注意的是,本题的日期范围从1960年1月1日至2059年12月31日,则year%100是从60到59循环查找时不会产生误判。
代码
#include<iostream>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断日期是否合法
bool check(int year,int month,int day)
{
//月份为0 或者 月份大于12 或者 天数为0 都不合法
if(month==0||month>12||day==0)
return false;
//如果不是2月 并且 这个月的天数大于了合法的该月应有的天数 都不合法
if(month!=2&&day>months[month])
return false;
//如果是2月,判断闰年还是平年
if(month==2)
{
//如果是闰年,则为true,因此leap为1
//如果是平年,则为false,因此leap为0
int leap=year%4==0&&year%100||year%400==0;
//如果2月的天数大于了合法的该月应有的天数 则不发合法
if(day>28+leap)
return false;
}
//否则说明日期date是合法的
return true;
}
int main()
{
int a,b,c;
scanf("%d/%d/%d",&a,&b,&c);
for(int date=19600101;date<=20591231;date++)
{
int year=date/10000;
int month=date%10000/100;
int day=date%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;
}