蓝桥杯代码问题(日期遍历)

问题描述
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
请提交满足条件的日期的总数量。

题目答案是70910,但是下边是我写的代码(填空题就没优化、简化代码),结果运行出来一直是71072,多了一些,请各路兄弟帮忙看一下,谢谢啦!

#include
using namespace std;
int t,cnt=0;
int sum1(int n)
{
    int sum=0; 
    while(n>0)
    {
        sum+=n%10;
        n/=10;
    }
    return sum;
}
int main()
{
    for(int i=1900;i<=9999;i++)
    {
        for(int j=1;j<=12;j++)
        {
            if(((i%400==0)||(i%4==0&&i%100!=0))&&(j==2))
            {
                t=28;
            }else
            {
                t=29;
            }
            if(j==1)t=31;
            if(j==3)t=31;
            if(j==4)t=30;
            if(j==5)t=31;
            if(j==6)t=30;
            if(j==7)t=31;
            if(j==8)t=31;
            if(j==9)t=30;
            if(j==10)t=31;
            if(j==11)t=30;
            if(j==12)t=31; 
            for(int k=1;k<=t;k++)
            {
                if(sum1(i)==sum1(j)+sum1(k))
                {
                    cnt++;
                }    
            }
        }
    }
    cout<

代码中的闰年判断

if(((i%400==0)||(i%4==0&&i%100!=0))&&(j==2)) 
{
  t=28;
}else
{
  t=29;
}

因为上面判断的是是否是闰年,如果是的话应把t=29, 否则才把t=28
应把顺序改一下:

if(((i%400==0)||(i%4==0&&i%100!=0))&&(j==2)) 
{
  t=29;
}else
{
  t=28;
}

您的代码思路是正确的,但是在判断闰年的逻辑上存在问题,造成了多计算的天数。

在您的代码中,对于闰年的判断条件是:

if((i%400==0)||(i%4==0&&i%100!=0)) 


但是这个条件判断的是是否为闰年,如果是闰年则2月份有29天。而在代码中,您使用了以下的逻辑:

if(((i%400==0)||(i%4==0&&i%100!=0))&&(j==2))
{
    t=28;
}else
{
    t=29;
}


这个逻辑是如果是闰年,则2月份有28天,否则有29天,与判断闰年的逻辑相反。因此,在判断闰年时需要把28和29的赋值调换一下,改成:

if((i%400==0)||(i%4==0&&i%100!=0)) 
{
    t=29;
}else
{
    t=28;
}


然后再将您的代码运行一遍,就可以得到正确的答案70910了。

答案来自 我点评开发社区 https://www.wodianping.com/