英雄哥《零基础算法》6/100讲之 “日期算法”

文章目录

  • 《算法零基础100讲》
  • 6.日期算法
    • What(记住)
    • Why(理解)
    • How(运用)
    • 参考资料

《算法零基础100讲》

该栏目是CSDN@英雄哪里出来大佬的万人千题计划第一阶段,其目标是让想要学会算法的人抱团成长,能通过这个项目稳步成长,扎扎实实掌握算法,最终用算法改变世界!

img

大佬将算法学习的路线总结如下,并分别根据五步路线总结写出了相应的教学内容,关于目前的第一阶段算法入门的详细的介绍可以看博文《万人千题:第一阶段,算法零基础抱团打卡》学习路线指引

img

100讲的学习大纲如下:

img

本学习笔记是根据该项目进行的每周总结,目标是总结归纳复盘,扩展并实实在在掌握学习内容。

每一讲的笔记内容大致分为四个部分:What(记住)、Why(理解)、How(运用)、Draw:

  1. What(记住)的内容是基础概念和预备知识汇总;
  2. Why(理解)的内容是在知道了What的基础上进行的扩展和理解;
  3. How(运用)是根据讲后习题进行的练习和模板总结;
  4. Draw是试图用图示的方式将所学内容进行可视化,方便记忆和内化。

6.日期算法

What(记住)

  1. 平年的天数为365,闰年的天数为366,多出来的天数称为【2月29日】;
  2. 闰年的判断规则为:
    1.1 年份是4的倍数而不是100的倍数
    1.2 或者年份是400的倍数
  3. 年份之间差多少个闰年可以用 ( ⌊ y e n d 4 ⌋ − ⌊ y e n d 100 ⌋ + ⌊ y e n d 400 ⌋ ) − ( ⌊ y b e g i n 4 ⌋ − ⌊ y b e g i n 100 ⌋ + ⌊ y b e g i n 400 ⌋ ) (\lfloor\frac{y_{end}}{4}\rfloor - \lfloor\frac{y_{end}}{100}\rfloor + \lfloor\frac{y_{end}}{400}\rfloor) - (\lfloor\frac{y_{begin}}{4}\rfloor - \lfloor\frac{y_{begin}}{100}\rfloor + \lfloor\frac{y_{begin}}{400}\rfloor) (4yend100yend+400yend)(4ybegin100ybegin+400ybegin) 进行计算;
  4. 日期的常见计算为:
    4.1 两个日期之间的天数
    4.2 日期在所属年份的第几天
    4.3 日期是是星期几
  5. 儒略日是一种不记年,不记月,只记日的历法,公式为: J u l i a n = 1461 × y + 4716 4 + 153 × m + 1 4 + d + c − 1524.5 Julian = 1461 \times \frac{y + 4716}{4} + 153 \times \frac{m + 1}{4} + d + c - 1524.5 Julian=1461×4y+4716+153×4m+1+d+c1524.5
  6. 使用数组存储已知序列可以更方便地进行计算
  • int monthDay[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; ///< 平年各月份的天数
    
    

Why(理解)

How(运用)

1185. 一周中的第几天
英雄哥《零基础算法》6/100讲之 “日期算法”_第1张图片
1154. 一年中的第几天
英雄哥《零基础算法》6/100讲之 “日期算法”_第2张图片
1360. 日期之间隔几天
英雄哥《零基础算法》6/100讲之 “日期算法”_第3张图片

bool isLeapYear(int y) {
    return (y % 4 == 0 && y % 100 || y % 400 == 0);
}
long getPassedDays(int day, int month, int year) {
    int monthDay[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
    int days = 0;

    for (int i = 1971; i < year; ++i) {
        days += isLeapYear(i) ? 366 : 365;
    }

    days += monthDay[month];
    days += day;
    if (isLeapYear(year) && month > 2) {
        days++;
    }

    return days;
}

int ascii2num(char *s, int len) {
    int res = 0;

    for (int i = 0; i < len; ++i) {
        printf("%c ", s[i]);
        res = res * 10 + (s[i] - '0');
    }

    return res;
}

int dayOfYear(char * date){
    int day = ascii2num(date + 8, 2);
    int month = ascii2num(date + 5, 2);
    int year = ascii2num(date, 4);

    return getPassedDays(day, month, year);
}

int daysBetweenDates(char * date1, char * date2){
    long days1 = dayOfYear(date1);
    long days2 = dayOfYear(date2);

    return fabs(days1 - days2);
}

参考资料

此处列出除文中链接之外的参考资料

  1. 算法——指定日期的星期推算

你可能感兴趣的:(万人千题学习报告,#,算法)