项目EULER#19 in C

时间:2014-12-09 17:37:28

标签: c

我在项目euler上尝试了问题19。答案是171,但我的代码给出了1199,这远远超出了预期的答案。有人可以告诉我哪里出错了吗? - 问题的链接在这里:https://projecteuler.net/problem=19

#include<stdio.h>
int main()
{
    int count=2;
    int flag1=0;
    int flag2=0;
    int month=1;
    int day=1;
    int year=1901;
    int sunday=0;//count sundays

    while(1)
    {

        //check for leapyears
        if(year%4)
        {
            if((year%100==0 && year%400==0) || year%100!=0)
                flag2=1;
        }

        //update months(31days)
        if((month==1 ||month==3 || month==5 || month==7 || month==8 || month==10|| month==12) && day==31) 
        {
            flag1=1;
            day=1;
            month++;
            if(month==13)
            {
                month=1;
                year++;
                flag2=0;
            }
        }
        //update months(30days)
        if((month==4 || month==6 || month==9 || month==11) &&  day==30)
        {
            flag1=1;
            day=1;
            month++;
        }
        //update month:february
        if(month==2)
        { 
            if((flag2==0 && day==28) || (flag2==1 && day==29))    
            {
                flag1=1;
                day=1;
                month=3;
            }      
        }

        //check sunday of every month
        if(count%7==0 && flag1==1)
        {
            sunday++;
            flag1=0;
        }

        count++;

    day++;        

        if(year==2001)
            break;
    }
    printf("%d\n",sunday);

    return 0;
}

1 个答案:

答案 0 :(得分:-1)

有三件事是错的。

  • 检查leapyears if(year%4)必须为if (year%4==0)
  • 更新月份:从一个月的最后一天到下个月的第一天,您忘记增加count天。
  • 检查每个月的星期日:在您遇到星期日之前,您不会重置flag1,即使这不是在当月的第一天。

后两个错误可以纠正如下:

        count += flag1; // account for extra day step
        if (count%7==0 && flag1) sunday++;
        flag1 = 0;      // reset `first of month` flag for this month