Sicily 1814. 日期计算问题 解题报告

Description

给定 2 个日期 yyyy.mm.dd 求两个日期间相差的天数。

Input

第 1 行为一个正整数T,表示测试数。

对于每个测试点,第 1 行与第 2 行分别有两个日期 yyyy.mm.dd。

Output

对于每个测试点,输出一行数字,表示相差的天数。

Sample Input 
2
2000.02.28
2000.03.01
6297.01.21
2351.11.27    
                
Sample Output
2
2
1440938
 
解题思路:
    将年月日转化为总的天数,就是从0年0月0日到输入的年月日的天数,其中需要计算总共有多少个闰年,是闰年的就加一。各个月份的天数用两个数组表示,一个数组表示普通年份,一个数组表示闰年。最后再将这两个值想减,得到间隔天数。
附源码:
 
   
1 #include < iostream >
2   using namespace std;
3
4   bool runnian( int year)
5 {
6 if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0 ))
7 {
8 return true ;
9 }
10 else return false ;
11 }
12   int year1,mouth1,day1,year2,mouth2,day2;
13
14   int longmouth[ 12 ] = { 31 , 29 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
15
16   int shortmouth[ 12 ] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 };
17
18   long days( int year, int mouth, int day)
19 {
20 long amounts = 0 ;
21 int i,j;
22 for (i = 0 ;i < year;i ++ )
23 {
24 if (runnian(i))amounts ++ ;
25 }
26 amounts += year * 365 ;
27 if (runnian(year))
28 {
29 for (i = 0 ;i < mouth - 1 ;i ++ )
30 amounts += longmouth[i];
31 }
32 else
33 {
34 for (i = 0 ;i < mouth - 1 ;i ++ )
35 amounts += shortmouth[i];
36 }
37 amounts += day;
38 return amounts;
39 }
40
41   int main()
42 {
43 int t;
44 long d;
45 char str[ 11 ];
46 cin >> t;
47 while (t -- )
48 {
49 cin >> str;
50 year1 = (str[ 0 ] - ' 0 ' ) * 1000 + (str[ 1 ] - ' 0 ' ) * 100 + (str[ 2 ] - ' 0 ' ) * 10 + (str[ 3 ] - ' 0 ' );
51 mouth1 = (str[ 5 ] - ' 0 ' ) * 10 + (str[ 6 ] - ' 0 ' );
52 day1 = (str[ 8 ] - ' 0 ' ) * 10 + (str[ 9 ] - ' 0 ' );
53 cin >> str;
54 year2 = (str[ 0 ] - ' 0 ' ) * 1000 + (str[ 1 ] - ' 0 ' ) * 100 + (str[ 2 ] - ' 0 ' ) * 10 + (str[ 3 ] - ' 0 ' );
55 mouth2 = (str[ 5 ] - ' 0 ' ) * 10 + (str[ 6 ] - ' 0 ' );
56 day2 = (str[ 8 ] - ' 0 ' ) * 10 + (str[ 9 ] - ' 0 ' );
57 if ((d = days(year1,mouth1,day1) - days(year2,mouth2,day2)) > 0 )
58 cout << d << endl;
59 else cout <<- d << endl;
60 }
61 return 1 ;
62 }
 
 

转载于:https://www.cnblogs.com/lvye/archive/2011/03/22/1991767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值