Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算星期五13_Algorithm_Date - Fatal编程技术网

Algorithm 计算星期五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

我的家庭作业是制作一个程序,从间歇时间算起,每周五都是第13天。你有两次约会:

  • 1924年8月6日
  • 1.1.2015
从这段时间开始,它必须计算所有的星期五。我成功了,一切正常,但问题是:

在4000年之后,它不直接计数。如果这些日期中的两个或至少一个都高于4000,我的程序将输出比它应该高出13个星期五的数量。该程序的工作原理如下:

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以上的日期。谢谢