数日子(SDUT 2558)

数日子

        Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
  按照公元纪年法,闰年被定义为能被 4 整除的年份,但是能被 100 整除而不能被 400 整除的年份除外,例如 1900 年就不是闰年。现在我们已知 2000 年 1 月 1 日为 星期六,你的任务是,对于给定的一个整数 n,写个程序计算并输出从 2000 年 1 月 1 日经过 n 天后的日期和该天是星期几。

Input
输入包含多组测试数据。
每组测试数据只包含一个正整数 n (0 <= n <= 99999)。

Output
对于每组测试数据,输出只有一行,为 n 天后的日期和该天为星期几,输出格式为 “YYYY-MM-DD week-day”(不包含引号) 具体格式见样例输出。

Example Input
100
400

Example Output
2000-04-10 Monday
2001-02-04 Sunday

Hint
“Monday”“Tuesday”“Wednesday”“Thursday”“Friday”“Saturday”“Sunday”
题目连接:
http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/2558.html

题意很简单,就是要计算出从2000年1月1日 星期六 经过n天后的日期
一开始我一看n最大才99999就直接暴力了,结果超时了,想了一下觉得应该是因为有多组输入,而计算时间不是求一次的,而是多组数据所用的时间和,所以我就用数组存起来了每经过一天的日期
至于星期的计算方法,将天数对7取余就好

AC的代码

/*本代码的主要想法是循环所有的日期,如果日期合法则计数加一,直到要求的天数*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define N 100000
int yea[N];
int mon[N];
int da[N];
int main(void)
{int i,j,k;int year = 2000,month = 1,day = 1;i = 0;int n;for(year = 2000;; year++){for(month = 1; month <= 12; month++){for(day = 1; day <= 31; day++){if(!((year%4==0 && year%100 != 0) || year%400 == 0)){if(month == 2 && day == 29)continue;}if(month == 2){if(day == 30 || day == 31)continue;}if(day == 31){if(month == 2 || month == 4 || month == 6 || month == 9 || month == 11)continue;}yea[i] = year;mon[i] = month;da[i] = day;i++;if(i > 99999)break;}if(i > 99999)break;}if(i > 99999)break;}while(scanf("%d",&n) != EOF){year = yea[n];month = mon[n];day = da[n];if(month / 10 == 0 && day / 10 != 0)printf("%d-0%d-%d ", year, month, day);else if(day / 10 == 0 && month / 10 != 0)printf("%d-%d-0%d ", year, month, day);else if(month / 10 == 0 && day / 10 == 0)printf("%d-0%d-0%d ", year, month, day);elseprintf("%d-%d-%d ", year, month, day);switch(n%7){case 0: printf("Saturday\n");break;case 1: printf("Sunday\n");break;case 2: printf("Monday\n");break;case 3: printf("Tuesday\n");break;case 4: printf("Wednesday\n");break;case 5: printf("Thursday\n");break;case 6: printf("Friday\n");break;}}return 0;
}

另一种方法是按月计算,以月为单位处理数据


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部