原题链接:生日日数
思路参考注释
参考代码:
#include <iostream>
using namespace std;
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//保存每月的最后一天
int check(int j)
{
arr[2]=28; //非闰年,2月28天,若为闰年,重新赋值为29即可
if(j%4==0&&j%100!=0||j%400==0)//闰年处理,2月份为29天
{
arr[2]=29;
return 366;
}
return 365;
}
int main()
{
int year,birthyear,birthmonth,birthday,time;
while(cin>>birthyear>>birthmonth>>birthday)//输入生年,生月,生日
{
time=0;
check(birthyear); //不需要返回值,但要判断是否为闰年,并为月份数组赋值
time+=arr[birthmonth]-birthday;//生月特殊计算,这个月的号数不等于天数,如15号生,16号与之相隔1天;
for(int j=birthmonth+1;j<=12;j++)//该年,遍历生月之后的每个月
{
time+=arr[j];
}
for(int i=birthyear+1;;i++)///生年第二年开始是完整的年
{
year=i; //保存每一年,(break)退出的时候,则为目标年份
time+=check(i);//10000天都是很多很多年之后的事了,在那之前算总天数就行
if(time>=10000)//第一个到达10000天的那一年,一定是我们要找的
break;
}
time-=check(year);//找到这一年,从第一天开始找,看看具体是哪天
for(int j=1;j<=12;j++)//该年,遍历每个月
{
for(int k=1;k<=arr[j];k++)//遍历每一天
{
time+=k;//这个月的号数代表这个月的天数,直接相加即可,下一次计算的时候记得清理掉之前加的号数
if(time==10000)
cout<<year<<"-"<<j<<"-"<<k<<endl;
if(k<arr[j])//统计完过后,要清理这一天,重新计算天数的时候要减去上一天的号数,如 1998,1,26(25-25+26=26天),而下一个月从1号开始,故上一个月的最后一天不用减,1998,2,1(31+1=32天)
time-=k;
}
}
}
return 0;
}//dongdong0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复