本帖最后由 hejinzhong 于 2014-7-18 16:16 编辑
- #include <stdio.h>
- #define leap(y) (y%4==0 && y%100!=0 || y%400==0)
- struct d{int y,m,d;};
- long days(struct d d1,struct d d2)
- {
- int mon[2][13]= { {0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31} };
- int i;
- long td=0;
- for(i=d1.y;i<d2.y;i++)//
- td+=leap(i)?366:365;
-
- for(i=1;i<d1.m;i++)
- td-=mon[leap(d1.y)][i];
- td-=d1.d-1;
-
- for(i=1;i<d2.m;i++)
- td+=mon[leap(d2.y)][i];
- td+=d2.d-1;
- return td;
- }
- void main()
- {
- struct d d1,d2;
- long td;
- printf("first date:");
- scanf("%d-%d-%d",&d1.y,&d1.m,&d1.d);
- printf("second date:");
- scanf("%d-%d-%d",&d2.y,&d2.m,&d2.d);
- td=days(d1,d2);
- printf("%ld",td);
- }
复制代码 先说下思路<假设输入的日期都是合法的>
思路:分为年月日三部分差的和作为最后的结果
(1)判断起始日期和结束日期之间相差的年。将这些年累加(每年判断是否是闰年,通过一个全局变量
(2)减去起始日期的已过月份所占的天数,加上结束日期已过月份的天数(通过查表法累加或减)
(3)减去起始日期的所在的天数,加上结束日期所在天数(通过查表法累加或减)上面是C实现的,java还没写,意思都一样
|