我的家庭作业是制作一个计划,计算所有星期五的间隔时间。你有两个日期:
它必须计算那个时期的所有星期五。我做到了,一切正常,但问题在于:
在4 000年之后,这是非常重要的。如果两个或至少其中一个日期高于4 000,我的计划将输出比应有的高13日的星期五。该计划的工作原理如下:
If firstday in month == Sunday then
countFirday++;
它循环了整个时期的所有月份,但是有28年的周期重复或400年的周期重复,因此它被优化并且对于大数字来说非常快。
我甚至尝试使用世界末日算法,但结果与我自己的算法相同。
我可能过于愚蠢而无法得到它,并要求你提供一个小小的提示,说明为什么在4000年之后出现问题。我非常感谢你的帮助。
答案 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;
}