题目链接
一些话
切入点
流程
套路
ac代码
题目描述:对于一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从 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个数位
// 9:50~
// 当小丑了,日期合法性里的或者全都写成了并且
#include
#include
#include
#include
#include
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;
}
我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!我草,又~在~水~字~数~啦!