求日期数(第十四届蓝桥杯模拟赛)(详解)
求日期数(第十四届蓝桥杯模拟赛)(详解)
(详解)
问题描述:
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。
请提交满足条件的日期的总数量。
答案:70910
(所有的解释均在代码里面)
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int months[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//月份数组
int is_leap(int year)//判断是不是闰年,来确定29的天数
{
if (year % 4 == 0 && year % 100 || year % 400 == 0)
return 1;
return 0;
}
int get_days(int year, int month)
{
if (month == 2)
return months[month] + is_leap(year);
else
return months[month];
}
int main()
{
int res = 0;
for (int i = 19000101; i <= 99991231; i++)//枚举所有的可能
{
int resa = 0, resb = 0;//resa代表年的各个位数相加的和,resb代表月和日的各个位数相加的和
int year = i / 10000;//年
int month = i / 100 % 100;//月
int day = i % 100;//日
if (month >= 1 && month <= 12 &&day<=get_days(year,month)&&day>0)//保证月在1--12,每个月的天数不超过应有的天数
{//判断这个所谓的年份是不是存在
//千万别忘了day一定要大于0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int a = i / 10000;
int b = i % 10000;
while (a)//求年的各个和
{
resa += a % 10;
a = a / 10;
}
while (b)//求月日的各个和
{
resb += b% 10;
b = b / 10;
}
if (resa == resb) res++;//如果相等,res++
}
}
cout << res;
return 0;
}