Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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
Python 算法逻辑-计算星期日_Python_Algorithm_Logic - Fatal编程技术网

Python 算法逻辑-计算星期日

Python 算法逻辑-计算星期日,python,algorithm,logic,Python,Algorithm,Logic,我写了一段代码,计算从1901年1月到2000年12月(包括1901年1月到2000年12月)每个星期天在一个月的第一天的次数。我知道正确答案是171,这比我得到的多了一个。这意味着要么我的算法逻辑有错误,要么我误解了问题陈述。我希望有人指出我的错误。这是问题陈述和我的代码: 1900年1月1日是星期一。三十天有九月、四月、六月和九月 十一月。除二月外,其余的都有三十一个 无论晴雨,他都有二十八岁。闰年是29岁 闰年发生在可以被4整除的任何一年,但不是在一年中 除非它能被400整除 在二十世纪有

我写了一段代码,计算从1901年1月到2000年12月(包括1901年1月到2000年12月)每个星期天在一个月的第一天的次数。我知道正确答案是171,这比我得到的多了一个。这意味着要么我的算法逻辑有错误,要么我误解了问题陈述。我希望有人指出我的错误。这是问题陈述和我的代码:

1900年1月1日是星期一。三十天有九月、四月、六月和九月 十一月。除二月外,其余的都有三十一个 无论晴雨,他都有二十八岁。闰年是29岁

闰年发生在可以被4整除的任何一年,但不是在一年中 除非它能被400整除

在二十世纪有多少个星期天是在一个月的第一天 世纪(1901年1月1日至2000年12月31日)

monthdict={
1: 31,
2: 28,
3: 31, 
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31
}
ly_monthdict={
1: 31,
2: 29,
3: 31, 
4: 30,
5: 31,
6: 30,
7: 31,
8: 31,
9: 30,
10: 31,
11: 30,
12: 31
}
闰年=假
星期日=0
第一个星期日=6
范围内的年份(19012001年):
如果年份%4==0,年份%100!=0:
闰年=真
elif年份%100==0和年份%400==0:
闰年=真
其他:
闰年=假
如果闰年:
对于范围(1,13)内的月份:
如果第一个星期日=1:
星期日+=1
当前周日=第一个周日
当当前星期日<每月[月]:
当前星期日+=7
第一个星期日=当前星期日-每月[月]
其他:
对于范围(1,13)内的月份:
当前周日=第一个周日
当本周日<月[monthdict]时:
当前星期日+=7
第一个星期日=当前星期日-月[月]
如果第一个星期日=1:
星期日+=1
打印(星期日,“星期日发生在月的第一天”)

看起来很傻,但是中的..的两个内部
块并不相同

如果您将
如果first_sunday==1
检查移动到非闰年循环的开始处,您将得到171作为您的答案

if leap_year:
    for month in range(1, 13):
        if first_sunday == 1:
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < ly_monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - ly_monthdict[month]
else:
    for month in range(1, 13):
        if first_sunday == 1:     #Moved this block up
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - monthdict[month]
如果闰年:
对于范围(1,13)内的月份:
如果第一个星期日=1:
星期日+=1
当前周日=第一个周日
当当前星期日<每月[月]:
当前星期日+=7
第一个星期日=当前星期日-每月[月]
其他:
对于范围(1,13)内的月份:
如果first_sunday==1:#将此块向上移动
星期日+=1
当前周日=第一个周日
当本周日<月[monthdict]时:
当前星期日+=7
第一个星期日=当前星期日-月[月]

同样值得庆幸的是,我已经十多年没有遇到过这些问题了。我建议您将这两个循环结合起来,并切换您使用的
dict
引用,而不是复制代码。

这是学校作业吗?如果没有,我建议看一下
日历
模块。@AndrejKesely这是ProjectEuler.net中的一个问题,它的重点是基于数学逻辑编写快速代码。我可以使用外部的图书馆,但我的想法是强迫使用数学来解决问题,而不是使用图书馆。非常感谢!我注意到其中一个循环中存在错误,而另一个循环中也忘记了更改。特别是,出现错误的原因是闰年1月的第一个月的星期日将被重复计算,而非闰年1月的第一个月的星期日将根本不被计算。很明显,这些几乎是相互抵消的。
if leap_year:
    for month in range(1, 13):
        if first_sunday == 1:
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < ly_monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - ly_monthdict[month]
else:
    for month in range(1, 13):
        if first_sunday == 1:     #Moved this block up
            sundays += 1
        curr_sunday = first_sunday
        while curr_sunday < monthdict[month]:
            curr_sunday += 7
        first_sunday = curr_sunday - monthdict[month]