《算法笔记》3.4小节——入门模拟->日期处理

《算法笔记》3.4小节——入门模拟->日期处理

A 日期差值

题目描述

有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。

输入

有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD

输出

每组数据输出一行,即日期差值

样例输入

20130101
20130105

样例输出

5

提交代码

#include<stdio.h>
int isprime(int n){
if((n%4==0&&n%100!=0)||n%400==0)
    return 1;
else
     return 0;
}
int main(){
  int num[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},
  {30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};
  int a,b,t;
int y1,m1,d1,y2,m2,d2;
  while(scanf("%d %d",&a,&b)!=EOF){
    if(a>b){
    t=a;
    a=b;
    b=t;
  }
  y1=a/10000;m1=a%10000/100;d1=a%100;
  y2=b/10000;m2=b%10000/100;d2=b%100;
  int count=0;
  while(y1!=y2||m1!=m2||d1!=d2){
    d1++;
    if(d1==num[m1][isprime(y1)]+1){
       d1=1;
       m1++;
       }
    if(m1==13){
    m1=1;
    y1++;
    }
    count++;
 }
 printf("%d\n",count+1);
  }
  return 0;
}

B Day of Week

C 打印日期

题目描述

给出年分m和一年中的第n天,算出第n天是几月几号。

输入

输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。

输出

可能有多组测试数据,对于每组数据,按 yyyy-mm-dd的格式将输入中对应的日期打印出来。

样例输入

2013 60
2012 300
2011 350
2000 211

样例输出

2013-03-01
2012-10-26
2011-12-16
2000-07-29

代码提交

#include <stdio.h>
#include <string.h>

int isprime(int n){
if((n%4==0&&n%100!=0)||n%400==0)
    return 1;
else
     return 0;
}
int main(){
	int month[13][2]={{0,0}, {31,31}, {28,29}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}};
	int y, m=1, d=0, n;
	while(scanf("%d%d", &y, &n)!=EOF){
		while(n>0){
			d++;
			if(d==month[m][isprime(y)]+1){
				m++;
				d=1;
			}
			if(m==13){
				y++;
				m=1;
			}
			n--;
		}
		printf("%04d-%02d-%02d\n", y, m, d);
		m=1, d=0;
	}
	return 0;
}

D 日期类

题目描述

编写一个日期类,要求按xxxx-xx-xx 的格式输出日期,实现加一天的操作。

输入

输入第一行表示测试用例的个数m,接下来m行每行有3个用空格隔开的整数,分别表示年月日。测试数据不会有闰年。

输出

输出m行。按xxxx-xx-xx的格式输出,表示输入日期的后一天的日期。

样例输入

2
1999 10 20
2001 1 31

样例输出

1999-10-21
2001-02-01

提示

注意个位数日期前面要有0。

代码提交

#include <stdio.h>
#include <string.h>

int isprime(int n){
if((n%4==0&&n%100!=0)||n%400==0)
    return 1;
else
     return 0;
}

int main()
{
	int num[13][2]={{0,0}, {31,31}, {28,29}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}};
	int year,month,day,days,m;
	while(scanf("%d",&m)!=EOF)
	{
		for(int i=0;i<m;i++)
	   {
		   scanf("%d%d%d", &year,&month,&day);

			if(day==num[month][isprime(year)]+1){
				month++;
				day=1;
			}
			if(month==13){
				year++;
				month=1;
			}
			day=day+1;
          printf("%04d-%02d-%02d\n", year,month,day);
       }
	}
	return 0;
}


E 日期累加

题目描述

设计一个程序能计算一个日期加上若干天后是什么日期。

输入

输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。

输出

输出m行,每行按yyyy-mm-dd的个数输出。

样例输入

1
2008 2 3 100

样例输出

2008-05-13

代码提交

#include <stdio.h>
#include <string.h>

int isprime(int n){
if((n%4==0&&n%100!=0)||n%400==0)
    return 1;
else
     return 0;
}


int main()
{
    int num[13][2]={{0,0}, {31,31}, {28,29}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}};
    int day,year,month,cnt;
    int n;
    scanf("%d",&n);

    for(int j = 0;j < n;j++){
        scanf("%d %d %d %d",&year,&month,&day,&cnt);
        for(int i = cnt;i > 0;i--){
            day++;
            if(day==num[month][isprime(year)]+1){
                month++;
                day = 1;
            }
            if(month == 13){
                year++;
                month = 1;
            }
        }
        printf("%04d-%02d-%02d\n",year,month,day);
    }
    return 0;
}

上一篇:【Python入门教程】第30篇 列表sort()方法


下一篇:2017-9 CCF 打酱油(100分)