开启左侧

高斯日记

二维码 [复制链接]
141 0
大数学家高斯有个好习惯:无论如何都要记日记。
他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210,后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。
这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?
高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。
高斯获得博士学位的那天日记上标着:8113   请你算出高斯获得博士学位的年月日。

提交答案的格式是:yyyy-mm-dd, 例如:1980-03-21

  1. /**************************************************************
  2. *     Copyright (C) 2006-2013 All rights reserved.
  3. *       @Version: 1.0
  4. *       @Created: 2013-05-26 19:01
  5. *        @Author: chin - qin@126.com
  6. *   @Description:
  7. *
  8. *       @History:
  9. **************************************************************/
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <malloc.h>
  14. /*高斯的出生日期,此处可以改为你自己的生日来测试*/
  15. #define BIRTH_YEAR  1777
  16. #define BIRTH_MONTH 4
  17. #define BIRTH_DAY 30

  18. static int leap_month[] = {31,29,31,30,31,30,31,31,30,31,30,31};
  19. static int non_leap_month[] = {31,28,31,30,31,30,31,31,30,31,30,31};

  20. /**
  21. * @brief is_leap_year
  22. * 判断是否为闰年
  23. * @Param: year
  24. *
  25. * Returns: 是闰年返回1,否则返回0
  26. */
  27. int is_leap_year(int year)
  28. {
  29.     int leap= (year % 400 == 0) ||
  30.         ((year % 4 == 0)&&(year % 100 != 0)) ;
  31.     return leap;
  32. }
  33. /**
  34. * @brief get_gauss_date
  35. * 用户输入高斯日期
  36. * Returns:
  37. */
  38. unsigned long get_gauss_date()
  39. {
  40.     unsigned long date;
  41.     char s[32];

  42.     while(1)
  43.     {
  44.         printf("Please input a number as the Gauss date[1-37527]:");
  45.         fgets(s, 32, stdin);
  46.         date = atol(s);
  47.         if(date != 0)
  48.             break;
  49.     }
  50.     return date;
  51. }
  52. /**
  53. * @brief still_left_time
  54. * 计算XXXX年还剩下多少天
  55. * @Param: year
  56. * @Param: month
  57. * @Param: day
  58. *
  59. * Returns:
  60. */
  61. int still_left_time(int year, int month, int day)
  62. {
  63.     int *p, days = 0, i;

  64.     if(is_leap_year(year))
  65.         p = leap_month;
  66.     else
  67.         p = non_leap_month;
  68.     days = p[month-1] - day;
  69.     for(i=month; i< 12; i++)
  70.         days += p;

  71.     return days + 1;
  72. }

  73. /**
  74. * @brief format_date
  75. * 将距离当前日期date天转换成具体的日期格式
  76. * @Param: date
  77. * @Param: year 当前日期年
  78. * @Param: month 当前日期月
  79. * @Param: day 当前日期日
  80. *
  81. * Returns:
  82. */
  83. char *format_date(unsigned long date, int year, int month, int day)
  84. {
  85.     int i = 0, *p;
  86.     unsigned long count = 0;
  87.     static char date_str[32];

  88.     if(is_leap_year(year))
  89.         p = leap_month;
  90.     else
  91.         p = non_leap_month;
  92.     if(month == BIRTH_MONTH && day == BIRTH_DAY)
  93.     {
  94.         count = p[month-1] - day + 1;

  95.         if(count >= date)
  96.         {
  97.             sprintf(date_str, "%04d-%02d-%02d",year, month, day + (int)date - 1);
  98.             return date_str;
  99.         }
  100.     }
  101.     for(i=month; i<12; i++)
  102.     {
  103.         count += p;
  104.         if(count >= date)
  105.         {
  106.             month = i + 1;
  107.             day = date - ( count - p );
  108.             sprintf(date_str, "%04d-%02d-%02d",year, month, day);
  109.             break;
  110.         }
  111.     }
  112.     return date_str;
  113. }

  114. /**
  115. * @brief caculate_gauss_date
  116. * 计算高斯日期函数
  117. * @Param: date  高斯日期
  118. * @Param: date_str  格式化后的日期
  119. *
  120. * Returns:
  121. */
  122. char *caculate_gauss_date(unsigned long date, char *date_str)
  123. {
  124.     unsigned long count1 = 0;
  125.     int left_time;
  126.     int days_of_year;
  127.     int year = BIRTH_YEAR, month = BIRTH_MONTH, day = BIRTH_DAY;
  128.     int i = 0;

  129.     if(date_str)
  130.     {
  131.         /*计算xxxx年这一年还剩下多少天*/
  132.         left_time = still_left_time(year, month, day);
  133.         if( date <= left_time )
  134.         {
  135.             return strcpy(date_str, format_date(date, year, month, day ) );
  136.         }
  137.         date = date - left_time;
  138.         year = BIRTH_YEAR;
  139.         month = 12;
  140.         day = 31;
  141.         /*从1788-01-01开始计时*/
  142.         while(1)
  143.         {
  144.             i++;
  145.             days_of_year = is_leap_year( BIRTH_YEAR + i ) > 0 ? 366 : 365;
  146.             count1 += days_of_year;
  147.             if(count1 >= date)
  148.             {
  149.                 year = BIRTH_YEAR + i;
  150.                 date = date - (count1 - days_of_year);
  151.                 break;
  152.             }
  153.         }
  154.         /*不足一年数的情况,格式化成具体日期*/
  155.         strcpy(date_str, format_date(date, year, 0, day ) );
  156.     }

  157.     return date_str;
  158. }
  159. int main()
  160. {
  161.     unsigned long date;
  162.     char date_str[32];

  163.     date = get_gauss_date();
  164.     printf("Gauss log date is:%lu\n",date);

  165.     caculate_gauss_date(date,date_str);

  166.     printf("Format date is:%s\n",date_str);

  167.     return 0;
  168. }
复制代码



赞助本站





上一篇:Base64加密解密
下一篇:排它平方数
学会善用【论坛搜索】功能,很多你要寻找的答案就在这里面;
如果大家发现帖子中链接有错误,请到【爱好街链接地址失效有奖报错】回帖,我们会在第一时间送上反馈的奖励!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

发新帖 回复

104

主题

104

帖子

233

街币
更多

精彩推荐

爱好街资源共享区文件解压密码
爱好街资源共享区文件解压密码
因本站分享的文件实在太多,目前收集整理已经接近4T,所以有些文
新人报到专用贴
新人报到专用贴
==新人报道格式(选填)== 【我的昵称】: 【我的性别
易辅客栈VIP教程之从零学辅助系列(大漠主讲)
易辅客栈VIP教程之从零学辅助
学易语言的都知道大漠,而且这套教材是零基础入门,非常棒的
独立团VIP教程第1-7版全套打包下载(含课件源码工具等)
独立团VIP教程第1-7版全套打包
独立团第1版易语言教程 独立团第一版1易语言入门 1-1-1外
挂茶馆全套教程(含课件,源码,工具等)完整版下载
挂茶馆全套教程(含课件,源码,
一切从零开始教程目录 第一部(游戏为征途,随便
爱好街链接地址失效有奖报错
爱好街链接地址失效有奖报错
我们的成长离不开大家的支持!! 各位爱好街的会员:

免责声明:
在爱好街发布的文章与主题属会员个人意见,与本站立场无关,文章内容由作者与爱好街享有相关版权,如需转载请注明出处或取得会员与本站的许可,否则本站将追究相应的法律责任,如部分内容有侵犯任何版权问题,请立即告知本站,本站将及时予以删除并致以最深的歉意。另外不得将本站内容用于商业或者非法用途,否则,一切后果请用户自负。

Mail To:MasTer@AiHaiJie.Com

快速回复
快速回复 返回顶部 返回列表