先吐槽一波:

家人们谁懂呀 因为一个字符写错了,让我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 哦

看到的帮忙点个赞吧,谢谢啦!! 嘻嘻嘻