《跟英雄哥学算法第三天》

  • 习题文章题解均在博客英雄哪里出来可以找到,博主在这里记录自己的刷题过程及解题报告,想刷题可以找英雄哥,人特比特别好,如果你有毅力并且坚持下去跟着他你会有想不到的提升。加油兄弟们。写这个题解也是想通过csdn这个平台监督自己,进而获得提升,希望自己坚持下去,加油啊!!!
  •  今天的题:《算法零基础100讲》(第6讲) 日期算法_英雄哪里出来-CSDN博客

这篇文章吧周期算法补全一下

#include<math.h>
bool is_leap_year(int y){
    if(y%4==0&&y%100!=0||y%400==0){
        return true;
    }
    return false;
}
int getdate(char *date){
    int year,mounth,day,sumday;
    int mounthday[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    sscanf(date,"%d-%d-%d",&year,&mounth,&day);
    //如果是闰年就加上366天否则就加上365天
    int i=0;
    for(i=1971;i<year;++i){
            sumday+=(is_leap_year(i)?366:365);
    }
    //累加月数
    mounthday[2]=is_leap_year(year)?29:28;
    for(i=1;i<mounth;i++){
        sumday+=mounthday[i];
    }
    sumday+=day;
    return sumday;
}
int daysBetweenDates(char * date1, char * date2){
    
    return abs(getdate(date1)-getdate(date2));
}

//判断闰年or平年
bool is_leap_year(int y){
    if(y%4==0&&y%100!=0||y%400==0){
        return true;
    }
    return false;
}
int StroInt(char*str,int len){
    int i=0;
    int sum=0;
    for(i=0;i<len;i++){
        sum=sum*10+(str[i]-'0');
    }
    return sum;
}
int dayOfYear(char * date){
    //判断闰年还是平年
    //枚举12个月份的天数 1  2  3  4  5  6  7  8  9  10 11 12
    int mounthday[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    //将date字符串提取成数字
    int year,mounth,day;
    year =StroInt(date+0,4);
    mounth =StroInt(date+5,2);
    day = StroInt(date+8,2);
    //月份+日=天数
    int sumday[13];
    sumday[0]=0;
    //2月特殊
    mounthday[2]=is_leap_year(year)?29:28;
    //累加本月的前几个月的天数
    for(int i=1;i<mounth;++i){
        sumday[i]=sumday[i-1]+mounthday[i];
    }
    //累加月的天数+本月的天数
     return sumday[mounth-1]+day;
}

char * dayOfTheWeek(int day, int month, int year){
    char * week[7] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
    int monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
    /* 输入年份之前的年份的天数贡献 */
    int days = 365 * (year - 1971) + (year - 1969) / 4;
   //举例 为什么要-1969年 因为四年一润 而1972年刚好是闰年 1972-1969 = 3 ,而3/4 = 0
  //,对输入的1972年如果月份大于3 在下面多加一天 这里就不加了 ,所以减去1969。
    /* 输入年份中,输入月份之前的月份的天数贡献 */
    for (int i = 0; i < month - 1; ++i) {
        days += monthDays[i];
    }
    if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month >= 3) {
        days += 1;
    }
    /* 输入月份中的天数贡献 */
    days += day;
    return week[(days + 3) % 7];
}

猜你喜欢

转载自blog.csdn.net/m0_61210742/article/details/122295077