问题描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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"。多个日期按从早到晚排列。
样例输入
02/03/04
样例输出
2002-03-04
2004-02-03
2004-03-02
这道题关键是如何按顺序输出和如果小于等于9的时候该怎么办。
我是将年月日转换成一段连续的数字,输出时把它们拆开就行,以下是代码
代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int b[5],temp;
long long ans[5];
int months[22]={0,31,28,31,30,31,30,31,31,30,31,30,31};//非闰年
int monthx[22]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年
int checks(int x) {
if(x%4==0 && x%100!=0) {
return 1;
} else {
if(x%400==0) {
return 1;
}
}
return 0;
}
int main()
{
string a;
cin>>a;
int n=a.size();
int j=0;
for(int i=0;i<n;i++) { //将数字提取出来
if(a[i]>='0' && a[i]<='9') {
b[j]=(b[j]*10)+(a[i]-'0');
} else {
j++;
}
}
if(b[1]>=1 && b[1]<=12 && b[2]>=1 && b[2]<=31) { //这里是年月日的判定,看懂这个下面
if(b[0]>=60) { //两个都是一样的。
temp=1900+b[0];
if(checks(temp))
{
if(monthx[b[1]]>=b[2])
{
ans[0]=(temp*10000)+b[1]*100+b[2];
}
} else {
if(months[b[1]]>=b[2])
{
ans[0]=(temp*10000)+b[1]*100+b[2];
}
}
}
if(b[0]<60) {
temp=2000+b[0];
if(checks(temp))
{
if(monthx[b[1]]>=b[2])
{
ans[0]=(temp*10000)+b[1]*100+b[2];
}
} else {
if(months[b[1]]>=b[2])
{
ans[0]=(temp*10000)+b[1]*100+b[2];
}
}
}
}
if(b[1]>=1 && b[1]<=31 && b[0]>=1 && b[0]<=12) {
if(b[2]>=60) {
temp=1900+b[2];
if(checks(temp))
{
if(monthx[b[0]]>=b[1])
{
ans[1]=(temp*10000)+b[0]*100+b[1];
}
} else {
if(months[b[0]]>=b[1])
{
ans[1]=(temp*10000)+b[0]*100+b[1];
}
}
}
if(b[2]<60) {
temp=2000+b[2];
if(checks(temp))
{
if(monthx[b[0]]>=b[1])
{
ans[1]=(temp*10000)+b[0]*100+b[1];
}
} else {
if(months[b[0]]>=b[1])
{
ans[1]=(temp*10000)+b[0]*100+b[1];
}
}
}
}
if(b[0]>=1 && b[0]<=31 && b[1]>=1 && b[1]<=12) {
if(b[2]>=60) {
temp=1900+b[2];
if(checks(temp))
{
if(monthx[b[1]]>=b[0])
{
ans[2]=(temp*10000)+b[1]*100+b[0];
}
} else {
if(months[b[0]]>=b[1])
{
ans[1]=(temp*10000)+b[1]*100+b[0];
}
}
}
if(b[2]<60) {
temp=2000+b[2];
if(checks(temp))
{
if(monthx[b[1]]>=b[0])
{
ans[2]=(temp*10000)+b[1]*100+b[0];
}
} else {
if(months[b[0]]>=b[1])
{
ans[2]=(temp*10000)+b[1]*100+b[0];
}
}
}
}
//cout<<ans[0]<<" "<<ans[1]<<" "<<ans[2]<<endl;
sort(ans,ans+3);
for(int i=0;i<4;i++) { //对整体数字进行切除
if(ans[i]!=0 && ans[i]!=ans[i+1]) {
cout<<ans[i]/10000<<"-";
ans[i]=ans[i]%10000;
temp=ans[i]/100;
if(temp<=9) {
cout<<0<<temp<<"-";
} else {
cout<<temp<<"-";
}
ans[i]=ans[i]%100;
if(ans[i]<=9){
cout<<0<<ans[i]<<endl;
} else {
cout<<ans[i]<<endl;
}
}
}
return 0;
}
这个代码可以通过蓝桥杯的测试,但测试数据实在是太小太水了,我甚至写错了代码都可以得分,所以我不太确定代码是否完全正确,以后还会继续钻研这道题,看看能不能更简略一些,实在是太长了,我自己都不想看,如果有更简略的代码,我会更新到这个帖子上的。