问题描述:
小蓝出生在一个艺术与运动并重的家庭中。 妈妈是位书法家,她希望小蓝能通过练习书法,继承她的艺术天赋,并练就一手好字。爸爸是一名篮球教练,他希望小蓝能通过篮球锻炼身体,培养运动的激情和团队合作的精神。为了既满足妈妈的期望,又不辜负爸爸的心意,小蓝决定根据日期的笔画数来安排自己的练习。首先,他会将当天的日期按照“YYYYMMDD
”的格式转换成一个 8
位数,然后将这
8
位数对应到汉字上,计算这些汉字的总笔画数。如果总笔画数超过 50
,他就去练习篮球;如果总笔画数不超过
50
,他就去练习书法。
例如,在 2024
年
1
月
1
日这天,日期可表示为一个
8
位数字
20240101
,其转换为汉字是“二零二四零一零一”。日期的总笔画数为 2 + 13 + 2 + 5 + 13 + 1 + 13 + 1 = 50,因此在这天,小蓝会去练习书法。
以下是汉字的笔画数对照表:
汉字:零,一,二,三,四,五,六,七,八,九
笔画数:13,1,2,3,5,4,4,2,2,2
现在,请你帮助小蓝统计一下,在 2000
年
1
月
1
日到
2024
年
4
月
13
日这段时间内,小蓝有多少天是在练习篮球?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。答案为3228。
方法一:枚举
从20000101枚举到20240413,计算每一天的日期笔画总数,统计大于50的日期总数。
使用三重循环遍历,第一层循环表示年份year,从2000到2024。第二层循环表示月份month,从1到12。第三层循环表示day,将每个月的天数存到数组day[]中,从1遍历到day[month]。使用一个函数count()计算日期的笔画数,方法是通过对10取余获得数字的最后一位,将其笔画数num[x]累加,再将数字除以10直到数字变为0结束while循环,并统计位数,如果小于2要手动补一个0。
第一次循环枚举之后再单独枚举2024年剩下的日期,和所有的闰年2月份。细节见代码及注释。
#include<bits/stdc++.h>
using namespace std;
int num[13]={13,1,2,3,5,4,4,2,2,2};//数字i对应的笔画数num[i]
int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//每个月i对应的总天数day[i]
int count(int x);//计算一个数字的笔画总数
int main()
{
int ans=0;//答案,打篮球的天数
for(int y=2000;y<=2023;y++)//遍历年份
{
for(int m=1;m<=12;m++)//遍历月份
{
for(int d=1;d<=day[m];d++)//遍历天份
{
if(count(y)+count(m)+count(d)>50) ans++;//如果笔画总数大于50,打篮球天数+1
}
}
}
day[4]=13;//2024年的4月份只遍历到13号
for(int y=2024;y<=2024;y++)//遍历年份
{
for(int m=1;m<=4;m++)//遍历月份
{
for(int d=1;d<=day[m];d++)//遍历天份
{
if(count(y)+count(m)+count(d)>50) ans++;//如果笔画总数大于50,打篮球天数+1
}
}
}
for(int y=2000;y<=2024;y+=4)//遍历所有的闰年
{
if(count(y)+count(2)+count(29)>50) ans++;//如果笔画总数大于50,打篮球天数+1
}
cout<<ans;//输出总数
return 0;
}
int count(int x)//计算数字的笔画数
{
int cnt=0,sum=0;
while(x)
{
cnt++;//数字位数+1
sum+=num[x%10];//数字当前最后一位的笔画数
x/=10;
}
if(cnt<2) sum+=num[0];//手动补一个首位0
return sum;
}