• 高斯日记


      这两天在准备蓝桥杯的杯赛,所以这里写一些它往年的题目我和做的解决程序!以用来整理!

      第四届比赛C/C++A组第一题,高斯日记,题目如下:

      大数学家高斯有个好习惯:无论如何都要记日记。他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210。后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天。这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢?

      高斯出生于:1777年4月30日。在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日。

      高斯获得博士学位的那天日记上标着:8113。请你算出高斯获得博士学位的年月日。

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

      我的解题思路如下,首先程序获取一个天数days,然后先把这个days不断减少1461(即四年的天数),同时年份year从1777开始不断加4,直到这个days小于1461。

      接下来再判断这个days所指定的那一天是否为闰年,这个就是看days现在是否小于1095,因为前三年平年加起来是1095,如果大于1095,则说明那个days所指定的日期为闰年。

      OK,判断好了年份之后,再不断减少月份所代表的天数,同时记录月份的变量month不断增加,最后days剩下的那个值,就是某月的具体某一天了。

      

      Ok,请原谅我叙述的比较混乱,下面我把代码贴上来,希望能够帮助大家理解:

     1 #include<errno.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<stdarg.h>
     5 #include<stdio.h>
     6 int main(int argc,char *argv[])
     7 {
     8     int days;
     9     int year = 1777;
    10     int month = 5;
    11     int flag = 0;   //是否为闰年的标记
    12     int month_a[2][13]={{-1,31,28,31,30,31,30,31,31,30,31,30,31},{-1,31,29,31,30,31,30,31,31,30,31,30,31}};
    13 
    14     printf("请输入天数:");
    15     scanf("%d",&days);
    16 
    17     //在减1之前5.1为第一天
    18     
    19     days -= 1;    //由于出生的那天即为第一天,所以要减1
    20 
    21     if(days <= 0)
    22     {
    23     days += month_a[0][4];    //1777年的四月份
    24     month--;
    25     }
    26 
    27     //先减去4年
    28     while(days > 1461)
    29     {
    30     days -= 1461;
    31     year += 4;
    32     }
    33     //判断那一年是否为闰年
    34     if(year > 1095)
    35     flag = 1;
    36     //再减去4年中的年份
    37     while(days > 365)
    38     {
    39     days -= 365;
    40     year += 1;
    41     }
    42     for(;month<=12 && days>month_a[flag][month];month++)
    43     {
    44     days -= month_a[flag][month];
    45     }
    46 
    47     printf("%d-%d-%d
    ",year,month,days);
    48 
    49     return 0;
    50 }

        代码中需要说明一下的是,为什么我要在刚开始让days减少1。因为高斯是4月30号出生的,四月30号即是第一天。而在这个程序中我是通过days来指定最后日期中的天的。也就是说,如果我输入的是1,那么这个days就应该变成30(代表1777年的4月30号中的这个30),所以要减去1。也就是说,如果在刚开始我没有减少1的话,那么就代表的是1777年的5月1号为第一天。

        对了,最后贴一个运行结果的截图上来吧:

        

        OK,就是这些内容了,第一回写这种描述算法的博客,叙述地比较混乱,还望见谅!

  • 相关阅读:
    js导出table到excel,同时兼容FF和IE
    Android 程式开发:(廿一)消息传递 —— 21.3 使用Intent发送短信
    [置顶] 让金融互联网-P2P网贷融资量增长10倍的广告宣传公益活动
    Headroom.js插件用法
    HDU 5289 Assignment(单调队列)
    sh_Spring整合Hibernate
    怎样高速启动Android模拟器(Android Emulator)
    设计模式——介绍与工厂模式(扁平管理模式VS职业经理人模式)
    在c++11中你最惊讶的新feature是什么?
    python的私有化
  • 原文地址:https://www.cnblogs.com/bwangel23/p/4270988.html
Copyright © 2020-2023  润新知