美文网首页
日期——1. 日期插值

日期——1. 日期插值

作者: 辘轳鹿鹿 | 来源:发表于2020-06-23 15:55 被阅读0次

上海交通大学复试日期差值问题

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

20110412
20110422

输出

11

解题心得:

  • 闰年的判断规则为Year%100!=0&&Year%4==0||Year%100==0
  • 如果超时,可以选择用空间换时间的策略。比如像本题一样,将答案预先保存在数组里。
  • 输入技巧:使用%4d来读取该八位数的前4位并赋值给代表年的变量
#include <stdio.h>
#include <stdlib.h>
#define isrun(x) (x%4==0&&x%100!=0)||(x%400==0)?1:0

struct Date{
    int year;
    int month;
    int day;
}tmp;
int buf[5001][13][32];
int MonthOfDay[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};
void NextDAY(){
    tmp.day++;
    if(tmp.day>MonthOfDay[tmp.month][isrun(tmp.year)]){
        tmp.day=1;
        tmp.month++;
    }
    if(tmp.month>12){
        tmp.month=1;
        tmp.year++;
    }
}


int main()
{
    int cnt=0;
    tmp.year=0;
    tmp.month=1;
    tmp.day=1;
    while(tmp.year!=5001){
        buf[tmp.year][tmp.month][tmp.day]=cnt;
        //printf("%d %d %d %d\n",tmp.year,tmp.month,tmp.day,buf[tmp.year][tmp.month][tmp.day]);
        NextDAY();
        cnt++;
    }
    int yy1,mm1,dd1,yy2,mm2,dd2;
    while(scanf("%4d%2d%2d",&yy1,&mm1,&dd1)!=EOF){
        scanf("%4d%2d%2d",&yy2,&mm2,&dd2);
        printf("%d\n",abs(buf[yy1][mm1][dd1]-buf[yy2][mm2][dd2])+1);
    }
    return 0;
}

相关文章

网友评论

      本文标题:日期——1. 日期插值

      本文链接:https://www.haomeiwen.com/subject/rdrhfktx.html