日期问题 历届试题

首先吧,日期类的题目都不难的。

/*
问题描述
  小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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 ;
}

当然很麻烦。

然后,对于这一题,我提交了两次。

为什么呢

我的代码太美腻了,羞答答不好意思

  1. 首先就是,这题目错了,当然没坑到我,我看样力不对头就改了,第一次75.
    题中写的是 年/月/日 日/月/年 月/日/年 
    其实啊是    年/月/日 日/月/年 日/年/月               到这里你会收获马马碧
  1. 包含00的,00 天 00月不可以。2000年的状态可以有 00
  2. 日期边界 剔除排列出后超过规定年限的                这些是要注意的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值