先吐槽一波:
家人们谁懂呀 因为一个字符写错了,让我debug了半天,流泪 流泪。。。。
发现之后只能说自己傻叉,这么简单的题还磨蹭半天找不到哪里错了,家人们一定要吸取我的教训,在考场上可以节约时间呦
问题描述
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。
例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
请提交满足条件的日期的总数量。
代码部分
方法一:本人的小菜鸡方法
#include <bits/stdc++.h>
using namespace std;
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
string chang(int x)
{
string s;
while(x)
{
int a=x%10;
s+=a+'0';
x/=10;
}
reverse(s.begin(),s.end());
return s;
}
bool check(int a)
{
if(a%4==0&&a%100||a%400==0) return true;
return false;
}
int main ()
{
int y=1900,m=1,d=1;
int cnt=0;
while(y<=9999)
{
if(check(y)&&m==2) a[1]=29;
else a[1]=28;
if(d==a[m-1]+1) d=1,m++;
if(m==13) y++,m=1;
string s1=chang(y);
string s2="";
if(m/10==0) s2='0'+chang(m);
else s2=chang(m);
string s3="";
if(m/10==0) s3='0'+chang(d);
else s3=chang(d);
int sum1=0,sum2=0,sum3=0;
for(int i=0;i<s1.size();i++) sum1=sum1+(s1[i]-'0');
for(int i=0;i<s2.size();i++) sum2=sum2+(s2[i]-'0');
for(int i=0;i<s3.size();i++) sum3=sum3+(s3[i]-'0');
if(sum1==(sum2+sum3))
{
// 用了三行,九个变量的输出,进行调试,才发现错误(上边的chang(d)写成chang(m)了) 我真的是废物🐂
// cout<<y<<" "<<m<<" "<<d<<endl;
// cout<<s1<<" "<<s2<<" "<<s3<<endl;
// cout<<sum1<<" "<<sum2<<" "<<sum3<<endl;
cnt++;
}
d++;
}
cout<<cnt<<endl;
return 0;
}
方法二:参考学长的简练代码(简洁 易懂)说到这我要亲自再打一遍 加强记忆呦
#include <bits/stdc++.h>
using namespace std;
int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int get(int x)
{
int sum=0;
while(x)
{
sum+=x%10;
x/=10;
}
return sum;
}
bool is_su(int x)
{
if(x%400==0||x%4==0&&x%100) return true;
return false;
}
int main ()
{
int res=0;
for(int i=1900;i<=9999;i++)
{
int syear=get(i);
for(int j=1;j<=12;j++)
{
if(is_su(i)&&j==2) month[2]=29;
else month[2]=28;
for(int k=1;k<=month[j];k++)
{
if(syear==(get(j)+get(k))) res++;
}
}
}
cout<<res<<endl;
return 0;
}
最终答案都是 70910 哦
看到的帮忙点个赞吧,谢谢啦!! 嘻嘻嘻