• 计算某天在当年是第几天


    1.先贴我自己的代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 int main(){
     5     setbuf(stdout,NULL);
     6     typedef struct{
     7         int year;
     8         int month;
     9         int day;
    10     } DATE;
    11     int num=0;
    12     int tue;
    13     DATE date;
    14 
    15     printf("Input the date:
    ");
    16     scanf("%d/%d/%d",&date.year,&date.month,&date.day);
    17     if((date.year%4==0&&date.year%100!=0)||(date.year%400==0))
    18         tue=29;
    19     else
    20         tue=28;
    21 
    22     switch(date.month-1)
    23     {
    24     case 11:num+=30;
    25     case 10:num+=31;
    26     case 9:num+=30;
    27     case 8:num+=31;
    28     case 7:num+=31;
    29     case 6:num+=30;
    30     case 5:num+=31;
    31     case 4:num+=30;
    32     case 3:num+=31;
    33     case 2:num+=tue;
    34     case 1:num+=31;break;
    35     default:printf("error!
    ");
    36     }
    37     num=num+date.day;
    38     printf("%d/%d is the %dth day of %d!
    ",date.month,date.day,num,date.year);
    39     return 0;
    40 }

    tue用来存放二月的天数,闰年为29天,非闰年为28天。某年为闰年的条件真是不容易记忆,能被4整除但是不能被100整除,或者能被400整除。

    算法核心为switch语句,月份为month时,把从1~month-1月的天数全部加起来。利用switch语句中当每个case后面没有break语句时就顺序执行的特点。编译时有好多警告,提示缺少break语句,直接忽略。

    2.答案书上有两种方法,我只贴关键的算法:

     1 switch(date.month)
     2 {
     3     case 1:num+=date.day;break;
     4     case 2:num+=date.day+31;break;
     5     case 3:num+=date.day+59;break;
     6     case 4:num+=date.day+90;break;
     7     case 5:num+=date.day+120;break;
     8     case 6:num+=date.day+151;break;
     9     case 7:num+=date.day+181;break;
    10     case 8:num+=date.day+212;break;
    11     case 9:num+=date.day+243;break;
    12     case 10:num+=date.day+273;break;
    13     case 11:num+=date.day+304;break;
    14     case 12:num+=date.day+334;break
    15     default:printf("error!
    ");
    16 }
    17 if(((date.year%4==0&&date.year%100!=0)||(date.year%400==0))&&date.month>=3)
    18     num+=1;

    第一种方法中,有一个思想值得借鉴:先计算闰年和平年相同的部分,两者的2月都有28天,先按2月有28天计算,全部计算完成之后,再把不同的那一天加上去。几乎所有代码都有一些边缘的东西需要处理,像这个例子中的多出的那天,这些问题一般是将这些边缘的东西先搁置不予处理,等处理完一般情况或者共性的情况之后,再把这些边缘的东西加上去。

    1 int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    2 for(i=1;i<date.month;i++)
    3     num+=day_tab[i];
    4 num+=date.day;
    5 if(((date.year%4==0&&date.year%100!=0)||(date.year%400==0))&&date.month>=3)
    6     num+=1;

    第二个算法就简洁多了,把每月的天数放到一个数组中来处理。把day_tab定义为13位,day_tab[0]=0,然后day_tab[i]就是第i月的天数,这个也是很值得效仿的。

  • 相关阅读:
    Django(十五)模板详解:模板标签、过滤器、模板注释、模板继承、html转义
    Python @函数装饰器及用法
    NPM概述及使用简介
    MVC、MVT简介
    十、Vue:Vuex实现data(){}内数据多个组件间共享
    九、响应式发:rem和less(适配移动端)
    八、Vue-lazyload
    Vue点到子路由,父级,无法高亮问题解决
    七、Vue组件库:Element、Swiper(轮播专用组件)
    六、Vue-Router:基础路由处理、路由提取成单独文件、路由嵌套、路由传参数、路由高亮、html5的history使用
  • 原文地址:https://www.cnblogs.com/Camilo/p/3389721.html
Copyright © 2020-2023  润新知