zoukankan      html  css  js  c++  java
  • 日期差值

    题目:http://codeup.cn/problem.php?id=1928

    1928: 日期差值

    时间限制: 1 Sec  内存限制: 32 MB
    提交: 7900  解决: 1789
    [提交][状态][讨论版][命题人:外部导入]

    题目描述

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

    输入

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

    输出

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

    样例输入

    20130101
    20130105

    样例输出

    5

    结题思路:来自胡凡的《算法笔记》

     1 #include <stdio.h>
     2 
     3 //判断是否为闰年
     4 int isLeap(int year) 
     5 {
     6     return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
     7 }
     8 
     9 int main()
    10 {
    11     int monthes[13][2] = { { 0, 0 }, { 31, 31 }, { 28, 29 }, { 31, 31 }, { 30, 30 }, { 31, 31 }, 
    12                         { 30, 30 }, { 31, 31 }, { 31, 31 }, { 30, 30 }, { 31, 31 }, { 30, 30 }, { 31, 31 } };
    13 
    14     int date1, date2;
    15     while (scanf("%d %d", &date1, &date2) != EOF)
    16     {
    17         int temp;
    18         if (date1 > date2){
    19             temp = date1;
    20             date1 = date2;
    21             date2 = temp;
    22         }
    23 
    24         int year1 = date1 / 10000, month1 = date1 / 100 % 100, day1 = date1 % 100;
    25         int year2 = date2 / 10000, month2 = date2 / 100 % 100, day2 = date2 % 100;
    26 
    27         int time = 1;
    28 
    29 
    30         //将年份差距先缩小到1年,这里加365或366的时候要考虑月份是在二月之前还是之后,这决定了用加一之后的年份判断平闰还是用加一之前的年份判断平闰
    31         if (month1 == 1 || (month1 == 2 && day1 <= 28))
    32         {
    33             while (year2 - year1 > 1) {
    34                 time += 365 + isLeap(year1);        //先判断是否为闰年,然后年份再加一
    35                 year1++;
    36             }
    37 
    38         }
    39 
    40         else
    41         {
    42             while (year2 - year1 > 1) {
    43                 year1++;
    44                 time += 365 + isLeap(year1);        //先年份再加一,然后判断是否为闰年
    45                 
    46             }
    47         }
    48 
    49         int flag = isLeap(year1);
    50         while (year1 < year2 || month1 < month2 || day1 < day2)
    51         {
    52             day1++;
    53 
    54             if (day1 == monthes[month1][flag + 0] + 1)        //如果满了当月的天数,就加一个月,日数变成1
    55             {
    56                 month1++;
    57                 day1 = 1;
    58             }
    59 
    60             if (month1 == 13)            //如果月份满了12就年份加一,更新闰年标记,月份变成1
    61             {
    62                 year1++;
    63                 flag = isLeap(year1);
    64                 month1 = 1;
    65             }
    66             time++;
    67         }
    68         printf("%d
    ", time);
    69     }
    70 
    71     return 0;
    72 
    73 }
  • 相关阅读:
    UVA 11235 Frequent Values ---RMQ
    UVA 12266 Stock prices --优先队列
    HDU 1896 Stones --优先队列+搜索
    POJ 1442 Black Box -优先队列
    POJ 2263 Heavy Cargo 多种解法
    POJ 3250 Bad Hair Day --单调栈(单调队列?)
    FZU1894 志愿者选拔 --单调队列
    POJ 2823 Sliding Window 再探单调队列
    UVA 11992 Fast Matrix Operations (二维线段树)
    两道相似KMP题
  • 原文地址:https://www.cnblogs.com/hi3254014978/p/11255521.html
Copyright © 2011-2022 走看看