Algorithm 计算星期五13
我的家庭作业是制作一个程序,从间歇时间算起,每周五都是第13天。你有两次约会:Algorithm 计算星期五13,algorithm,date,Algorithm,Date,我的家庭作业是制作一个程序,从间歇时间算起,每周五都是第13天。你有两次约会: 1924年8月6日 1.1.2015 从这段时间开始,它必须计算所有的星期五。我成功了,一切正常,但问题是: 在4000年之后,它不直接计数。如果这些日期中的两个或至少一个都高于4000,我的程序将输出比它应该高出13个星期五的数量。该程序的工作原理如下: If firstday in month == Sunday then countFirday++; 它从周期开始循环所有月份,但有28年周期重复或4
- 1924年8月6日
- 1.1.2015
If firstday in month == Sunday then
countFirday++;
它从周期开始循环所有月份,但有28年周期重复或400年周期重复,因此它是优化的,对于大数字来说相当快
我甚至尝试了世界末日算法,但结果和我自己的算法一样
我可能太蠢了,不想得到它,并要求你提供一个小提示,为什么它在4000年后算错了。谢谢你的帮助。你把4000年标记为闰年吗?如果出现以下情况,则应为闰年: 这一年可以被4整除
如果一年可以平均除以100,那就不是闰年,除非
这一年也可以被400整除。然后是闰年。更新 我试图解决这项任务 输入
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;
}
#包括
布尔岛年度(国际年){
返回(年份%400==0 | |年份%4==0和年份%100!=0)?真:假;
}
布尔月2月(整数月){
返回月份==2?真:假;
}
int getDaysInMonth(int m,int year){
如果(2月1日(m)){
if(isLeapYear(year))返回29;
返回28;
}
如果(m==4 | | m==6 | | m==9 | | m==11)返回30;
返回31;
}
作废getNextDay(整数和fromDay、整数和fromMonth、整数和fromYear)
{
int daysInMonth=getDaysInMonth(fromMonth,fromYear);
if(fromMonth==12&&fromDay==daysInMonth){
fromYear++;
fromMonth=1;
fromDay=1;
}else if(fromDay==daysInMonth){
fromMonth++;
fromDay=1;
}否则{
fromDay++;
}
}
int main(){
int fromDay、fromMonth、fromYear;
今天,明天,今年;
int startDay=1,startMonth=1,startYear=1;
整数天=1;
int fridayQty=0;
scanf(“%02d.%02d.%04d”、&fromDay、&fromMonth、&fromYear);
scanf(“%02d.%02d.%04d”,&今天、明天和今年);
而(!(开始日期==从年和开始月份==从月和开始日期==从日)){
getNextDay(startDay、startMonth、startYear);
天++;
}
而(!(fromYear==toYear&&fromMonth==toMonth&&fromDay==toDay)){
如果(fromDay==13&&days%7==5)周五数量++;
getNextDay(fromDay、fromMonth、fromYear);
天++;
}
printf(“%d\n”,星期五数量);
返回0;
}
显示您尝试过的代码。您考虑过“闰年”吗<代码>闰年=(年份%400==0 | |年份%4==0和年份%100!=0)?真:假代码>您是否尝试过不使用28年周期优化?我试了400年的周期,没有结果,数字都一样。我没有忘记为闰年设置条件,我设置了条件,4000年不是闰年。一定还有什么我不知道的。你知道1924年8月6日哪一天吗?或者你只有两个日期?是的,它已经实现了。不能显示整个代码,只能显示小部分,也不能显示太多。我们将它上传到学校系统,系统测试所有可能的数据+如果ppl得到相同的代码或类似的代码,他们将受到严厉的惩罚。所以我有点担心,很多ppl还没有完成它,它的最后期限也快到了。你在上面说:“我提出了一个条件,那就是4000年不是闰年。”。4000年是闰年。虽然4000年可以被4整除,但它也不是闰年。我可以说,你的代码即使对于较小的日期,如1.1.1900--1.1.2015,也不起作用。它应该输出:197 ur程序给出输出:195,我不需要整个代码,只是有人试图弄清楚为什么之后它的计数不正确4000年,因为我花了太多时间思考,在谷歌上搜索,但我什么也没发现,明白吗。请现在试一试。我已经更新了我的solution.assert(CountFriday13(2174,11,14,205101914,10,25和cnt)==1和&cnt==351599554LL);断言(CountFriday13(2055,3,15,209725592,11,12和cnt)==1和&cnt==359526067LL);断言(CountFriday13(2021、1、21、20947、10、16和cnt)==1和&cnt==32440LL);断言(CountFriday13(2142,4,20286,1,11和cnt)==1和&cnt==31095LL);如果它能正确地处理所有这些数据,那么你可以帮助我,告诉我你在代码中做了什么来处理4000以上的日期。谢谢