acm代码会产生错误的答案

时间:2015-03-06 20:37:35

标签: c++ acm

我正试图在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

1 个答案:

答案 0 :(得分:0)

问题描述说明:

  

可以被400整除的世纪年是闰年,其他都不是。

但是如果不能被400整除,那么你的代码就不会占据100%而不是闰年的年份。

您需要修复错误。此处提供了确定一年是否为闰年的算法说明:https://stackoverflow.com/a/725111/2415524