ACM-日历问题

来源:互联网 发布:网络机柜cqwsjg 编辑:程序博客网 时间:2024/05/18 01:31

问题描述

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

解题思路

        根据题目要求,所有涉及的数值都是用整数可以表示的。这个问题可以分解成两个彼此独立的问题:一个是要求的那天是星期几,另一是要求的那天是哪年哪月那天。第一个问题比较简单,知道 2000 年 1 月 1 日是星期几后,只要用给定的日期对 7 取模,就可以知道要求的一天是星期几。第二个问题相对麻烦一些。我们用 year, month, date 分别表示要求的日期的年、月、日。当输入一个整数 n 时,如果 n 大于等于一年的天数,就用 n 减去一年的天数,直到 n 比一年的天数少(这时假设剩下天数为 m),一共减去多少年 year 就等于多少;如果 m 大于等于一个月的天数,就用 m 减去一个月的天数,直到 m 比一个月的天数少(这时假设剩下的天数为 k) ,一共减去多少个月 month 就等于多少;这时 k 为从当月开始逝去的天数, k+1 就是要求的 date。这里减去一年的天数时要判断当年是否是闰年,减去一月时要判断当月有几天。

参考程序

#include <iostream>#include <cstdio>using namespace std;int type(int m);char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};int year[2]={365,366}; //year[0]表示非闰年的天数, year[1]表示闰年的天数。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};//month[0]表示非闰年里每个月的天数, month[1]表示闰年里每个月的天数。int main(){int days,dayofweek;//days 表示输入的天数, dayofweek 表示星期几。int i=0,j=0;while(cin>>days){if(days == -1){break;}dayofweek = days % 7; //计算星期//计算年份,每次都减去对应年份天数 for(i=2000;days>=year[type(i)];i++){days-=year[type(i)];}//计算月份,每次都减去对应月份天数 for(j=0;days>=month[type(i)][j];j++){days -= month[type(i)][j];}printf("%d-%02d-%02d %s\n",i,j+1,days+1,week[dayofweek]);}return 0;}//判断第 m 年是否是闰年,是则返回 1,否则返回 0。int type(int m){if(m % 4 != 0 || (m %100==0 && m%400 != 0)){return 0;}return 1;}

0 0
原创粉丝点击