《跟英雄哥學演演算法第三天》

2022-01-05 11:00:01
  • 習題文章題解均在部落格英雄哪裡出來可以找到,博主在這裡記錄自己的刷題過程及解題報告,想刷題可以找英雄哥,人特位元別好,如果你有毅力並且堅持下去跟著他你會有想不到的提升。加油兄弟們。寫這個題解也是想通過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];
}