【问题标题】:Why doesn't this project euler #19 code work? (Python)为什么这个项目 euler #19 代码不起作用? (Python)
【发布时间】:2014-03-15 07:42:48
【问题描述】:

我在 Python 中为项目 euler 的 #19 问题编写了代码,但它没有给我正确的答案。 问题是:您获得了以下信息,但您可能更愿意自己做一些研究。

1900 年 1 月 1 日是星期一。 九月三十天, 四月、六月和十一月。 其余的都有三十一个, 独自拯救二月, 其中有二十八,风雨无阻。 在闰年,二十九。 闰年出现在任何能被 4 整除的年份,但不会出现在世纪上,除非它能被 400 整除。 在 20 世纪(1901 年 1 月 1 日至 2000 年 12 月 31 日)有多少个星期日?

这里有什么问题?:

months = {'January': 31,
     'February': 28,
     'March': 31,
     'April': 30,
     'May': 31,
     'June': 30,
     'July': 31,
     'August': 31,
     'September': 30,
     'November': 30,
     'December': 31
     }

years = range(1900, 2001)    

day = 1

def main():
    global day
    for year in years:
        if year % 4 == 0 or year % 400 == 0:
            months['February'] = 29
        else:
            months['February'] = 28

        for month in months:
            if months[month] == 31:
                day += 31 % 7 +1
            while day > 7:
                day = day - 7
            if day == 1:
                yield day


result = sum(main())
print (result)

而且每次我使用它都会产生不同的答案,

谢谢:)

【问题讨论】:

  • day += 31 % 7 +1 等价于day += 4
  • 1.为什么要从 1900 年开始?不应该是1901吗? 2.闰年的条件似乎不正确。 year%4==0 and year%100!=0 3.在月份循环中,为什​​么只测试一个月是否有31天?
  • 我从 1900 年开始,因为他们在信息中说 1900 年 1 月 1 日是星期一。

标签: python


【解决方案1】:

我不明白算法和你的代码。但我可以说一下。

it generates different answers everytime I use

可能你在执行result = sum(main())之前忘记初始化monthyearday

【讨论】:

    【解决方案2】:

    如果你使用dateutil库,解决方案会更简单:

    In [16]: from datetime import datetime
    In [17]: from dateutil.relativedelta import relativedelta
    
    In [18]: current = datetime(1901, 1, 1)
    In [19]: end = datetime(2001, 1, 1)
    In [20]: ans = 0
    
    In [21]: while current < end:
       ....:     if current.weekday() == 6:
       ....:         ans += 1                          
       ....:     current += relativedelta(months=1)
       ....:     
    
    In [22]: ans
    Out[22]: 171
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-09
      • 1970-01-01
      • 2019-12-11
      • 2016-07-02
      • 2019-12-02
      • 1970-01-01
      • 2018-11-05
      • 2012-02-22
      相关资源
      最近更新 更多