描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天
输入:有多组数据,每组数据有两行,分别表示两个日期,形式为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语言结构体定义的几种方法