1064:日历问题

来源:互联网 发布:掌握系统优化的方法 编辑:程序博客网 时间:2024/06/04 18:41

问题 F: 日历问题

时间限制: 10 Sec  内存限制: 128 MB
提交: 766  解决: 412
[提交][状态][讨论版]

题目描述

在我们现在使用的日历中, 闰年被定义为能被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“。

样例输入

1730174017501751-1

样例输出

2004-09-26 Sunday2004-10-06 Wednesday2004-10-16 Saturday

2004-10-17 Sunday

问题分析

开始的日期是2000年1月1日,查阅资料得知当天是Saturday。那么开工吧!

求星期几是显而易见的,求余即可。

关键是输出年月日。

输入的是从那天开始逝去的天数,假设为days,只要days!=-1,就进行循环。

循环当中首先求年份。只要days还大于365或者366,就进行减法运算,days-=365或者366,这个数字需要判断闰年与否。这里还是挺巧妙的,等会儿看具体代码。

剩下的日子就小于一年了,同理,每次减去月份的天数,直到小于当月天数,最后剩下的日子就和日期相差无几了。

如何判断当月天数和当年是否是闰年呢?提前创建好数组,分别存放各自的天数,再在year[]、month[]的方括号里进行闰年的判断,就差不多啦。

最后输出的天数,加一减一的,可以代入特殊值验证一下,比如days=1,是2000年1月2日 星期天,日期加了一。

那么代码:

#include <iostream>#include <iomanip>using namespace std;int leap(int);char weekday[7][10] = { "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" };//已知2000年1月1日是星期六  一定要细心别拼错了,一开始就把Wednesday拼错了,提交出错总是查不到原因……int year[2] = { 365, 366 };int month[2][12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//分别是平年的月份天数和闰年的月份天数。耐心、细心!注意和year顺序对应int main(){int days=0, dayofweek;int i = 0, j = 0;while (days != -1){cin >> days;if (days == -1) break;dayofweek = days % 7;// 取模得到星期几for (i = 2000; days >= year[leap(i)]; i++){//核能预警,非战斗人员迅速撤退……如果天数大于一年的天数就减去一年,直到小于365或366days -= year[leap(i)];}for (j = 0; days >= month[leap(i)][j]; j++)//与上面同理,减掉每个月的天数,直到小于当月天数{days -= month[leap(i)][j];}cout << i << "-" <<setfill('0')<< setw(2)<<j + 1 << "-" <<setfill('0')<<setw(2)<< days + 1 << " " << weekday[dayofweek] << endl;//按照格式输出,注意月份+1(因为j从0开始),天数+1,可以自己代入特殊值推算一下}//注意输出样例的09,06,需要设置域宽并填充0.这个方法是百度来的,记住就好。头文件iomanip.hsystem("pause");return 0;}int leap(int i){                      //判断闰年与否,注意和year对应if ((i % 4 != 0) ||( i % 100 ==0 && i % 400 != 0))  return 0;//0是平年else return 1;//1是闰年}


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 货物被香港律政司扣了怎么办 室友考研要跟我考一样的学校怎么办 药流第一天才吃了一粒米非司怎么办 药流半月同房第二天大出血怎么办 口臭想让它变得不臭怎么办 来单位干了几天不满意想离职怎么办 药流吃药期间吃什么吐什么怎么办 养狗家里味道大怎么办养花有用吗 第一天上班站的脚疼怎么办 入职没有人事所需要的证书怎么办 入职第一天后不想去了怎么办 警察在执法过程中殴打群众怎么办 肾结石打了3天针痛得厉害怎么办 征兵体检过了到部队退兵怎么办 圆通快递要求退回结果被签收怎么办 新生儿蛋蛋淹了破皮了怎么办 要是和同学玩的时候打到睾丸怎么办 睾丸撞了一下里面碎了怎么办 睾丸被蚊子咬了挠坏流水疼怎么办 沐浴乳大量的灌注到尿道里怎么办 当电脑显示有文件损害时怎么办? 电脑上的压缩包手机上打不开怎么办 第五人格多酷账号退出了怎么办 更新显卡驱动时屏幕关闭了怎么办 不知道杯孕做了两次C丁怎么办 小说签约后更不到要求的字数怎么办 电脑中了感染病毒杀不干净怎么办 电脑下载的软件有病毒了怎么办 电脑强制关机后开不了机怎么办 受刺激后出现精神异常该怎么办 当屏幕出现暂时无法移动时怎么办 英雄联盟欧服连接不上服务器怎么办 试客联盟认证手机号成空号了怎么办 汽车脚垫不贴合翘起来了怎么办 版权保护迅雷下载不了的资源怎么办 30岁在外地城市找不到工作怎么办 新买的苹果爱拍充不进去电是怎么办 绝地求生东南亚服匹配不到人怎么办 电脑卡住了怎么办鼠标也点不动 幽灵行动荒野没有主线任务了怎么办 拼多多购买的东西下架了怎么办