zoukankan      html  css  js  c++  java
  • 2.给出距离1900年1月1日的天数,求日期

     1 #include <iostream>
     2 #include <assert.h>
     3 
     4 
     5 //判断是否闰年
     6 bool IsLeapYear(unsigned int year)
     7 {
     8   if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
     9   {
    10     return true;
    11   }
    12   else
    13   {
    14     return false;
    15   }
    16 }
    17 
    18 //根据一年中的第几天(0起始),返回月份(1起始),并且置天数为其在本月的索引(0起始)
    19 unsigned int GetMonthByDay(unsigned int &day, bool leap)
    20 {
    21   assert(day < (leap ? 366 : 365));
    22   static unsigned int monthtable[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    23   monthtable[1] = leap ? 29 : 28;
    24 
    25   unsigned int  month = 0;
    26   unsigned int count = 0;
    27   unsigned int n = day;
    28 
    29   do
    30   {
    31     n = day - count;
    32     count += monthtable[month++];
    33   } while (day >= count);
    34   day = n;
    35   return month;
    36 }
    37 
    38 //距离1900年1月1日的天数(0起始),返回年,并且置天数为其在本年的索引(0起始)
    39 unsigned int GetYearByDay(unsigned int &day)
    40 {
    41   unsigned int Y = day / 365;
    42   int D = day % 365;
    43   int  YY = Y - 1;
    44   D -= YY / 4;
    45   D += YY / 100;
    46   D -= (YY + 300) / 400;
    47   while (D < 0)
    48   {
    49     Y--;
    50     D += IsLeapYear(Y + 1900) ? 366 : 365;
    51   }
    52   day = D;
    53   return Y + 1900;
    54 }
    55 
    56 //距离1900年1月1日的天数(0起始),计算这一天的日期(年,月,日)(1起始)。
    57 void foo(unsigned int &day, unsigned int &year, unsigned int &month)
    58 {
    59   year = GetYearByDay(day);
    60   month = GetMonthByDay(day, IsLeapYear(year));
    61   day += 1;
    62 }
    63 
    64 int main()
    65 {
    66   unsigned int day = 42696;
    67   unsigned int year = 0;
    68   unsigned int month = 0;
    69   foo(day, year, month);
    70   std::cout << year << "/" << month << "/" << day << std::endl;
    71   getchar();
    72   return 0;
    73 }
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/csqtech/p/6142186.html
Copyright © 2011-2022 走看看