我正试图在USACO解决“星期五十三号”:
星期五十三号真的是一个不寻常的事件吗?
那就是,本周13日的星期五是否比一周中的任何其他日子少?要回答这个问题,请编写一个程序,计算每个月13日在一个给定的N年期间在星期日,星期一,星期二,星期三,星期四,星期五和星期六登陆的频率。测试的时间段为1900年1月1日至1900年12月31日+ N-1,给定年数,N。N为正,不超过400。
请注意,开始年份是NINETEEN HUNDRED,而非1990年。
在解决此问题之前,您需要了解一些事实:
1900年1月1日是星期一。 三十天有九月,四月,六月和十一月,所有其余的都有31个,除了二月有28个,除了闰年有29个。 每年可被4整除的是闰年(1992 = 4 * 498,因此1992年将是闰年,但1990年不是闰年) 上述规则不适用于世纪年。可以被400整除的世纪年是闰年,其他都不是。因此,世纪年1700,1800,1900和2100年不是闰年,而2000年是闰年
我的代码产生了错误的答案,虽然我确定问题的逻辑
这是我的代码
#include <iostream>
using namespace std;
void fn(int y,int N)
{
int m=1,m_days,res[7]={0},x=0;
res[0]=1;
for(int i=1;i<=(N-1);i++)
{
for(int m=1;m<13;m++)
{
if((y%4==0)||(y%400==0)||(y%100==0)&&(m==2))
m_days=29;
else if((y%4!=0)||(y%400!=0)||(y%100!=0)&&(m==2))
m_days=28;
else if((m>=8)&&(m%2==0))
m_days=31;
else if((m<8)&&(m%2!=0))
m_days=31;
else
m_days=30;
x=(m_days+x)%7;
res[x]++;
}
}
for(int j=0;j<7;j++)
{
cout <<res[j]<<" ";
}
}
int main(int argc, char** argv) {
int year=1900;
int n;
cin>>n;
fn(year,n);
return 0;
}
样本输入20 样品输出36 33 34 33 35 35 34
答案 0 :(得分:0)
问题描述说明:
可以被400整除的世纪年是闰年,其他都不是。
但是如果不能被400整除,那么你的代码就不会占据100%而不是闰年的年份。
您需要修复错误。此处提供了确定一年是否为闰年的算法说明:https://stackoverflow.com/a/725111/2415524