## 求日期数(第十四届蓝桥杯模拟赛)(详解)

程序计算1900年至9999年间,年月日数位和相等的日期总数为70910个,涉及闰年判断和日期验证。
摘要由CSDN通过智能技术生成

求日期数(第十四届蓝桥杯模拟赛)(详解)

求日期数(第十四届蓝桥杯模拟赛)(详解)

(详解)

问题描述:
对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 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;
}
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值