首先吧,日期类的题目都不难的。
/*
问题描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
*/
#include<stdio.h>
#include<stdbool.h>
typedef struct Node
{
int nian;
int yue ;
int ri ;
}point;
void input( int , int , int , point * );
void shai_cha( point * , int );
void sort( point * , int );
void pd_output( point * , long long );
bool panduan( point * );
bool pd_run( int );
int main(void)
{
int S1 , S2 , S3 ;
char c1 , c2 ;
point RQ[ 7 ] ;
scanf("%2d/%2d/%2d", &S1, &S2, &S3);
input( S1 , S2 , S3 , RQ );
sort( RQ , 7 );
shai_cha( RQ , 7 );
return 0;
}
bool panduan( point * rq )
{
int sz[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
pd_run( (int)(rq->nian) ) == true ? sz[2] = 29 : 0;
int A = (rq->nian >= 1960 && rq->nian <= 2059);
int B = (rq->yue >= 1 && rq->yue <= 12);
int C = (rq->ri >= 1 && rq->ri <= sz[ rq->yue ]);
return A + B + C == 3;
}
void pd_output( point * rq , long long sum )
{
int sum1 = rq->nian*10000 + rq->yue*100 + rq->ri;
if( sum1 > sum )
{
if( panduan( rq ) == true )
{
printf("%04d-%02d-%02d\n",rq->nian,rq->yue,rq->ri);
}
}
}
bool pd_run( int year )
{
return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
void shai_cha( point * rq , int th )
{
rq ++ ;
long long sum = 0;
while( th -- )
{
pd_output( rq , sum ); // printf ("%d\n",sum);
sum = rq->nian*10000 + rq->yue*100 + rq->ri;
rq ++ ;//printf("%04d-%02d-%02d\n",rq[6].nian,rq[6].yue,rq[6].ri);
}
}
void sort( point * rq , int th )
{
int i , k ;
for( i = 1 ; i < th ; i ++ )
{
for( k = 1 ; k < th - i + 1 ; k ++ )
{
if( rq[ k ].nian * 10000 + rq[ k ].yue * 100 + rq[ k ].ri <
rq[k-1].nian * 10000 + rq[k-1].yue * 100 + rq[k-1].ri )
{
point tmp = rq[k];
rq[ k ] = rq[k-1];
rq[k-1] = tmp ;
}
}
}
}
void input( int s1 , int s2 , int s3 , point * rq )
{ //年月日 日年月 日月年 题目一开始说的不一样
rq[1].nian = 1900 + s1 , rq[1].yue = s2 , rq[1].ri = s3 ;
rq[2].nian = 1900 + s3 , rq[2].yue = s1 , rq[2].ri = s2 ;
rq[3].nian = 1900 + s3 , rq[3].yue = s2 , rq[3].ri = s1 ;
rq[4].nian = 2000 + s1 , rq[4].yue = s2 , rq[4].ri = s3 ;
rq[5].nian = 2000 + s3 , rq[5].yue = s1 , rq[5].ri = s2 ;
rq[6].nian = 2000 + s3 , rq[6].yue = s2 , rq[6].ri = s1 ;
}
当然很麻烦。
然后,对于这一题,我提交了两次。
为什么呢
我的代码太美腻了,羞答答不好意思
- 首先就是,这题目错了,当然没坑到我,我看样力不对头就改了,第一次75.
题中写的是 年/月/日 日/月/年 月/日/年
其实啊是 年/月/日 日/月/年 日/年/月 到这里你会收获马马碧
- 包含00的,00 天 00月不可以。2000年的状态可以有 00
- 日期边界 剔除排列出后超过规定年限的 这些是要注意的