计算星期五13日

时间:2015-11-28 10:14:45

标签: algorithm date

我的家庭作业是制作一个计划,计算所有星期五的间隔时间。你有两个日期:

  • 1924年6月8日
  • 2015年1月1日

它必须计算那个时期的所有星期五。我做到了,一切正常,但问题在于:

在4 000年之后,这是非常重要的。如果两个或至少其中一个日期高于4 000,我的计划将输出比应有的高13日的星期五。该计划的工作原理如下:

If firstday in month == Sunday then
   countFirday++;

它循环了整个时期的所有月份,但是有28年的周期重复或400年的周期重复,因此它被优化并且对于大数字来说非常快。

我甚至尝试使用世界末日算法,但结果与我自己的算法相同。

我可能过于愚蠢而无法得到它,并要求你提供一个小小的提示,说明为什么在4000年之后出现问题。我非常感谢你的帮助。

2 个答案:

答案 0 :(得分:0)

您是否将4000年标记为闰年?如果出现以下情况应该是闰年:

年份可被4整除; 如果年份可以平均除以100,则不是闰年,除非;
这一年也可以被400整除。然后是闰年。

答案 1 :(得分:0)

<强>更新

我试图解决这个问题。

输入

06.08.1924
01.01.2015

结果将是:155

#include<cstdio>

bool isLeapYear(int year){
    return (year%400 == 0 || year%4 == 0 && year%100 != 0) ? true: false;
}

bool isMonthFebruary(int month){
    return month == 2 ? true : false;
}


int getDaysInMonth(int m, int year){
    if(isMonthFebruary(m)){
        if(isLeapYear(year)) return 29;
        return 28;
    }

    if(m == 4 || m == 6 || m == 9 || m == 11) return 30;

    return 31;
}


void getNextDay(int &fromDay, int &fromMonth, int &fromYear)
{

    int daysInMonth = getDaysInMonth(fromMonth, fromYear);

    if(fromMonth == 12 && fromDay == daysInMonth){
        fromYear ++;
        fromMonth = 1;
        fromDay = 1;
    }else if(fromDay == daysInMonth) {
        fromMonth ++;
        fromDay = 1;
    }else {
    fromDay ++;
    }
}

int main(){

    int fromDay, fromMonth, fromYear;
    int toDay, toMonth, toYear;
    int startDay = 1, startMonth = 1, startYear = 1;
    int days = 1;

    int fridayQty = 0;

    scanf("%02d.%02d.%04d", &fromDay, &fromMonth, &fromYear);
    scanf("%02d.%02d.%04d", &toDay, &toMonth, &toYear);

    while(!(startYear == fromYear && startMonth == fromMonth && startDay == fromDay)){
        getNextDay(startDay, startMonth, startYear);
        days ++;
    }

    while(!(fromYear == toYear && fromMonth == toMonth && fromDay == toDay)){
        if(fromDay == 13 && days%7 == 5) fridayQty ++;
        getNextDay(fromDay, fromMonth, fromYear);
        days ++;
    }

    printf("%d\n", fridayQty);

    return 0;
}