日期差值(王道)

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

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

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

样例输入:

20110412

20110422

样例输出:

11

 (这个代码是根据王道机试上的答案改编的,实际上并没能运行出来,编译没有问题,但while处空间?太大了)

#include <stdio.h>
#include <stdlib.h>
#define ISYEAR(x) x % 100 !=0 && x % 4 == 0 || x % 400 == 0 ? 1: 0

int dayOfMonth[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 buf[5001][13][32];
int Abs(int x){
return x < 0 ? -x : x;
}

void nextDay(int Day, int Month,int Year){
Day++;
if(Day>dayOfMonth[Month][ISYEAR(Year)]){
    Day = 1;
    Month ++;
    if(Month > 12){
        Month = 1;
        Year ++;
    }
}
}

struct Date{
int Day;
int Month;
int Year;
};
struct Date date;

int main()
{
    int count = 0;
    date.Day=1;
    date.Month=1;
    date.Year=0;
    while(date.Year!=5001){
        buf[date.Year][date.Month][date.Day] = count;
        nextDay(date.Year,date.Month,date.Day);
        count++;
    }
    int d1,m1,y1;
    int d2,m2,y2;
    scanf("%4d%2d%2d",&y1,&m1,&d1);
    scanf("%4d%2d%2d",&y2,&m2,&d2);
    count = Abs(buf[y2][m2][d2]-buf[y1][m1][d1]);
    printf("%d\n",count);
    return 0;
}

 

总结:上面有几个地方我觉得适合学习一下,首先是宏判断进行判断闰年,实际上也可以用函数进行,包括dayofMonth也可以成为一个一维数组而不是二维数组;

实际上之前struct里面有函数的,但后来报错,我就拿出来了,但本来是应该运行ok的,这种用法也很是我以前没这么使用过的。

struct Date{
int Day;
int Month;
int Year;
void nextDay(){
Day++;
if(Day>dayOfMonth[Month][ISYEAR(Year)]){
    Day = 1;
    Month ++;
    if(Month > 12){
        Month = 1;
        Year ++;
    }
}
}
};

 

要注意一个问题,C语言和c++里的struct使用是不大一样的,C语言在声明变量时是一定要在前面写struct的,例如

struct student{
...
};
struct student stu1;    //struct不可省略

c++可以省略:

struct student{
...
};
student stu1;    //struct可省略

具体C语言的结构体定义看文章:C语言结构体定义的几种方法

 

posted @ 2018-03-05 15:50  Shaw_喆宇  阅读(197)  评论(0编辑  收藏  举报