日期识别基础版:

任务描述

世界上不同国家有不同的写日期的习惯。比如美国人习惯写成“月-日-年”,而中国人习惯写成“年-月-日”。 于龙在写一些日期时不小心把年份写错位置了,可能在最前,可能在中间,也可能在最后。

下面请你写个程序,自动把读入的于龙日期改写成中国习惯的日期。

输入格式:

输入在一行中按照“mm-dd-yyyy”或“mm-yyyy-dd”或“yyyy-mm-dd”的格式给出年、月、日。题目保证给出的日期是1900年元旦至今合法的日期,保证月在前日在后,保证年份是4位数。

输出格式:

在一行输出正确的中国人习惯的日期格式,要求月份和日期都用2位输出,不足2位前补0。

输入样例1:

5-1-2019

输出样例1:

2019-05-01

输入样例2:

11-2019-05

输出样例2:

2019-11-05

C代码:

#include<stdio.h>
int main()
{
	int y,m,d;
	int a,b,c;
	scanf("%d-%d-%4d",&a,&b,&c);

	if(a>100){
		y=a;
		m=b;
		d=c;
	}
	if(b>100){
		y=b;
		m=a;
		d=c;
	}
	if(c>100){
		y=c;
		m=a;
		d=b;
	}
	
	printf("%4d-%.2d-%.2d",y,m,d);
	return 0;
}

 日期识别初级版:

任务描述

X同学最近非常烦,因为他正面对一大堆日期数据愁眉不展,原因是那些日期书写的极其不规范,不仔细辨别根本认不清是哪一天。
以下每个日期中的三个数,年月日的位置是不确定的,假设其中最大的数表示年份,1-12范围的数表示月份,1-31范围的数表示日期,如果月日的范围都是1-12则按前月后日的顺序识别。
例如:
2/3-123     识别为0123年2月3日,合法;
13+12+45    识别为0045年12月13日,合法;
12=3=13     识别为0013年12月3日,合法;
29,2,2019   识别为2019年2月29日,这一天不存在,不合法;
12@12#12    识别为0012年12月12日,合法;
35.36.37    识别为0037年XX月XX日,XX超出月份和日期范围,不合法;
11*30*30    识别为0030年11月30日,合法;

现在X要编程判断一下那些日期到底是否合法,你们说他能编出来吗。

输入格式:

一行,以X-Y-Z形式表示的一个日期,其中X、Y、Z为不超过4位的正整数,“-”为一个分隔字符,可能为任何符号。

输出格式:

若该日期为合法存在的日期,以“YYYY-MM-DD”的形式输出该日期的规范式,年4位,月日2位,不足前补0。 若该日期为不合法日期,输出:Invalid Date!。

输入样例1:

25-30-5

输出样例1:

0030-05-25

输入样例2:

2019-32-09

输出样例2:

Invalid Date!

输入样例3:

2019-30-09

输出样例3:

2019-09-30

代码: 

#include<stdio.h>
int main() {
	int a,b,c;
	int y,m,d;

	scanf("%d%*c%d%*c%d",&a,&b,&c);
	if(a>=b&&a>=c) {
		y=a;
		m=b;
		d=c;
	} else if(b>=a&&b>=c) {
		y=b;
		m=a;
		d=c;
	} else if(c>=a&&c>=b) {
		y=c;
		m=a;
		d=b;
	}

	int flag=1;
	if(m>12&&d>12) {
		flag=0;
	}
	if((m<1||m>12)&&flag==1) {
		int temp=m;
		m=d;
		d=temp;
	}

	int r[12]= {31,29,31,30,31,30,31,31,30,31,30,31};
	int br[12]= {31,28,31,30,31,30,31,31,30,31,30,31};

	if((y%4==0&&y%100!=0)||y%400==0) {
		int day=r[m-1];
		if(d>day)
			flag=0;
	} else {
		int day=br[m-1];
		if(d>day)
			flag=0;
	}

	if(flag==1) {
		printf("%04d-%02d-%02d\n",y,m,d);
	} else {
		printf("Invalid Date!\n");
	}
	return 0;
}

  日期识别升级版:

任务描述

倒霉的X同学最近总是和日期过不去,因为他叕一次面对一大堆日期数据痛不欲生。这一次的原因是那些日期书写的极其不规范,仔细辨别也根本认不清是哪一天,因为很多日期可以理解为多种情况。
以下每个日期中的三个数,年月日的位置是不确定的,所以导致有多种理解。例如:
2/3/1     可理解为0002-03-01或0003-02-01或0001-02-03等6种情况;
13+12+45  只可理解为0045-12-13一种情况;
12=3=13   可理解为0012-03-13或0002-12-13或0013-12-03或0013-03-12四种情况;
29,2,2019 怎么理解都不是合法日期;
35.36.37  怎么理解都不是合法日期;
11*31*30  可理解为0031-11-30一种情况;

现在X同学要编程判断一下那些日期到底可以理解成几个不同合法日期形式,你们说他能编出来吗。

输入格式:

一行,以X-Y-Z形式表示的一个日期,其中X、Y、Z为不超过4位的正整数,“-”为一个分隔字符,可能为任何符号。 系统测试数据保证X、Y、Z各不相同。

输出格式:

若该日期可以理解为合法存在的日期,输出它可以被理解成的合法日期个数; 若该日期无法理解成合法日期,输出:Invalid Date!。

输入样例1:

2/3/1

输出样例1:

6

输入样例2:

13+12+45

输出样例2:

1

输入样例3:

29,2,2019

输出样例3:

Invalid Date!

输入样例4:

35-36-37

输出样例4:

Invalid Date!

输入样例5:

11-30-31

输出样例5:

1

 代码:

#include<stdio.h>

int rq_day(int y,int m,int d){    //判断日期是否合理
	int flag=1;
	int r[12]= {31,29,31,30,31,30,31,31,30,31,30,31};
	int br[12]= {31,28,31,30,31,30,31,31,30,31,30,31};

    if(m>=1&&m<=12){
	if((y%4==0&&y%100!=0)||y%400==0) {
		int day=r[m-1];
		if(d>day)
			flag=0;
	} else {
		int day=br[m-1];
		if(d>day)
			flag=0;
	}}else{
        flag=0;
    }
	
	return flag;
} 

int main()
{
	int a,b,c;
	int y,m,d;
	scanf("%d%*c%d%*c%d",&a,&b,&c);
	
	int num=0;
	if(rq_day(a,b,c)){
		num++;
	}
	if(rq_day(a,c,b)){
		num++;
	}
	if(rq_day(b,a,c)){
		num++;
	}
	if(rq_day(b,c,a)){
		num++;
	}
	if(rq_day(c,b,a)){
		num++;
	}
	if(rq_day(c,a,b)){
		num++;
	}
		
	if(num==0){
		printf("Invalid Date!");
	}else{
		printf("%d",num);
	}
	return 0;
}