题目链接
题目描述:对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和。例如,2022年11月13日满足要求,因为 2+0+2+2=(1+1)+(1+3) 。请提交满足条件的日期的总数量
一些话
当小丑了,日期合法性里的||全都写成了&&,写错了也不知道,完全被oi赛制拿捏了
等到蓝桥杯正赛一定要重新审一遍代码,确保没有错误
切入点
请提交满足条件的日期的总数量
求满足性质的情况的数量,符合枚举的特征
流程
请问从 1900 年 1 月 1 日至 9999 年 12 月 31 日,
总共有多少天,年份的数位数字之和等于月的数位数字之和加日的数位数字之和
一共是要满足日期合法,在题目区间内,和数位数字和。三条性质
日期在题目区间内最好枚举,直接枚举19000101 - 99991231,提出年月日的数字判断就行
套路
日期合法性判断
int months[13] {0,31,28,31,30,31,30,31,31,30,31,30,31}; bool check(int year,int month,int day){ if(!day || day > months[month] && month != 2) return false; if(!month || month > 12) return false; if(month == 2 && day > 28 + (year % 100 && year % 4== 0 || year % 400 == 0)) return false; return true; } in
数位提取
用/n来除去从右往左的ln n个数位,用%来保留从右往左的ln n个数位
ac代码
// 9:50~ // 当小丑了,日期合法性里的或者全都写成了并且 #include <iostream> #include <algorithm> #include <vector> #include <cstdio> #include <cstring> using namespace std; const int N = 1e5 + 10; int months[13] {0,31,28,31,30,31,30,31,31,30,31,30,31}; bool check(int year,int month,int day){ if(!day || day > months[month] && month != 2) return false; if(!month || month > 12) return false; if(month == 2 && day > 28 + (year % 100 && year % 4== 0 || year % 400 == 0)) return false; return true; } int main(){ int cnt = 0; for(int i = 19000101;i <= 99991231;i++){ int year = i / 10000; int month = i % 10000 / 100; int day = i % 100; // if(i == 19000101)printf("%d %d %d %d %d %d %d %d\n",year / 1000,year % 1000 / 100,year % 100 / 10 ,year % 10,month / 10 ,month % 10,day / 10 ,day % 10) ; if(check(year,month,day) && year/1000 + year % 1000 / 100 + year % 100 / 10 + year % 10 == month / 10 + month % 10 + day / 10 + day % 10) cnt ++; } cout << cnt ; return 0; }