【问题标题】:Problem 19 project Euler Counting Sundays问题 19 项目欧拉计数星期日
【发布时间】:2020-03-31 03:34:05
【问题描述】:

这是我的Project Euler #19 代码。问题的答案是 171,但我的代码生成 172。请任何人都可以在下面的代码中找出问题所在。

#include <bits/stdc++.h>
using namespace std ;
typedef long long LL ;
int ordYear[12] = {31,28,31,30,31,30,31,31,30,31,30,31} ;
int leapYear[12] = {31,29,31,30,31,30,31,31,30,31,30,31} ;

int main(){
    int leapFlag = 0 ;
    LL ans = 0 ;
    int dayonfirst = 2 ; // since it was tuesday on 1 Jan 1901
    for (int i=1901 ; i<=2000 ; i++){
        if ( (i%4==0 && i%100!=0) || (i%100==0 && i%400==0) )
            leapFlag = 1 ;
        for (int i=0 ; i<12 ; i++){
            int oddDays ;
            if (leapFlag == 1)
                oddDays = leapYear[i]%7 ;
            else
                oddDays = ordYear[i]%7 ;
            dayonfirst += oddDays  ;
            if(dayonfirst == 7)
                ans++ ;
            else if (dayonfirst > 7)
                dayonfirst = dayonfirst%7 ;
        }
    }
    cout << ans << endl ;
    return 0 ;
}

【问题讨论】:

  • leapFlag 在哪里重置?我错过了吗?
  • 能否在此处添加问题陈述或问题陈述的链接?

标签: c++ math adhoc


【解决方案1】:

当不是闰年时,您需要else statement 分配leapFlag = 0

if ( (i%4==0 && i%100!=0) || (i%100==0 && i%400==0) )
    leapFlag = 1; 
else 
    leapFlag = 0;

【讨论】:

  • 请考虑建议使用像bool is_leap_year(int year) 这样的函数来封装(和测试)该逻辑。
猜你喜欢
  • 2023-04-10
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多