思路参考注释

参考代码:

#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;
}//dongdong


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论