2014-12-09 6 views
-6

Я пробовал проблему 19 на эйлере проекта. Ответ равен 171, но мой код дает 1199, что не соответствует ожидаемому ответу. Может кто-нибудь, пожалуйста, скажите мне, где я ошибаюсь? - Ссылка на проблему здесь: https://projecteuler.net/problem=19PROJECT EULER # 19 in C

#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

Как вы пытались отладить его до сих пор? – Shaun

+0

'if (year% 4)' никогда не является високосным годом, поэтому последующие столетние испытания не имеют успеха. –

+0

'leap = year% 4 == 0 && (year% 100! = 0 || year% 400 == 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