问题描述
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 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/