暑期软件能力实训4-15.日历问题

【问题描述】

在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。

【输入形式】

输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是−1, 不必处理。可以假设结果的年份不会超过9999。

【输出形式】

对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday“。

【样例输入】

1730
1740
1750
1751
-1

【样例输出】

2004-09-26 Sunday
2004-10-06 Wednesday
2004-10-16 Saturday
2004-10-17 Sunday

说明:两种大情况需要分类进行处理,各个月的天数也要考虑在内,还有控制格式的要求

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	//日历问题
	int n;
	while(cin>>n&&n!=-1) { //输入给定的天数
		int year=2000,month=0,day=0;
		int s=(n+1)/365;//进行大致的估算
		int y=(n+1)%365;
		int run=0;
		for(int i=2000; i<2000+s; i++) {
			if(i%4==0&&i%100!=0)
				run++;
			if(i%100==0&&i%400==0)
				run++;
		}
		if(run<y) { //修补中的第一种情况
			y-=run;
			year+=s;
			cout<<year<<'-';
			if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0)) {
				day+=y;//闰年的情况
				if(day<=31) {
					month++;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
				}
				if(day>31&&day<=60) {
					month+=2;
					day-=31;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>60&&day<=91) {
					month+=3;
					day-=60;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>91&&day<=121) {
					month+=4;
					day-=91;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>121&&day<=152) {
					month+=5;
					day-=121;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>152&&day<=182) {
					month+=6;
					day-=152;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>182&&day<=213) {
					month+=7;
					day-=182;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>213&&day<=244) {
					month+=8;
					day-=213;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>244&&day<=274) {
					month+=9;
					day-=244;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>274&&day<=305) {
					month+=10;
					day-=274;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>305&&day<=335) {
					month+=11;
					day-=305;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>335&&day<=366) {
					month+=12;
					day-=335;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}

			} else { //平年的情况
				day+=y;
				if(day<=31) {
					month++;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
				}
				if(day>31&&day<=59) {
					month+=2;
					day-=31;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>59&&day<=90) {
					month+=3;
					day-=59;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>90&&day<=120) {
					month+=4;
					day-=90;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>120&&day<=151) {
					month+=5;
					day-=120;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>151&&day<=181) {
					month+=6;
					day-=151;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>181&&day<=212) {
					month+=7;
					day-=181;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>212&&day<=243) {
					month+=8;
					day-=212;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>243&&day<=273) {
					month+=9;
					day-=243;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>273&&day<=304) {
					month+=10;
					day-=273;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>304&&day<=334) {
					month+=11;
					day-=304;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>334&&day<=365) {
					month+=12;
					day-=334;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
			}
		} else { //修补中更加复杂的一种情况
			s--;
			year+=s;
			int temp=2000+s;
			if((temp%4==0&&temp%100!=0)||temp%400==0)
			run--;
			y=n+1-365*s-run;
			cout<<year<<'-';
			if((year%4==0&&year%100!=0)||(year%100==0&&year%400==0)) {
				day+=y;//闰年的情况
				if(day<=31) {
					month++;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
				}
				if(day>31&&day<=60) {
					month+=2;
					day-=31;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>60&&day<=91) {
					month+=3;
					day-=60;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>91&&day<=121) {
					month+=4;
					day-=91;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>121&&day<=152) {
					month+=5;
					day-=121;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>152&&day<=182) {
					month+=6;
					day-=152;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>182&&day<=213) {
					month+=7;
					day-=182;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>213&&day<=244) {
					month+=8;
					day-=213;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>244&&day<=274) {
					month+=9;
					day-=244;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>274&&day<=305) {
					month+=10;
					day-=274;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>305&&day<=335) {
					month+=11;
					day-=305;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>335&&day<=366) {
					month+=12;
					day-=335;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}

			} else { //平年的情况
				day+=y;
				if(day<=31) {
					month++;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';//输出前半部分
				}
				if(day>31&&day<=59) {
					month+=2;
					day-=31;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>59&&day<=90) {
					month+=3;
					day-=59;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>90&&day<=120) {
					month+=4;
					day-=90;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>120&&day<=151) {
					month+=5;
					day-=120;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>151&&day<=181) {
					month+=6;
					day-=151;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>181&&day<=212) {
					month+=7;
					day-=181;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>212&&day<=243) {
					month+=8;
					day-=212;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>243&&day<=273) {
					month+=9;
					day-=243;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>273&&day<=304) {
					month+=10;
					day-=273;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>304&&day<=334) {
					month+=11;
					day-=304;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
				if(day>334&&day<=365) {
					month+=12;
					day-=334;
					cout<<setw(2) << setfill('0')<<month<<'-'<<setw(2) << setfill('0')<<day<<' ';
				}
			}




		}
		if(n%7==6) cout<<"Friday"<<endl;
		if(n%7==0) cout<<"Saturday"<<endl;
		if(n%7==1) cout<<"Sunday"<<endl;
		if(n%7==2) cout<<"Monday"<<endl;
		if(n%7==3) cout<<"Tuesday"<<endl;
		if(n%7==4) cout<<"Wednesday"<<endl;
		if(n%7==5) cout<<"Thursday"<<endl;
	}
	return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值