2691 - 日历
给定一个天数,输出经过这么多天后的一个时间。
闰年是可以被4整除但是不能被100整除,或者可以被400整除的。
Input
每组数据包括一个正整数n, 初始日期为2000年1月1号. 最后一行包括一个整数-1, 假设年份不超过9999
Output
对于每组数据, 输出个数为: "YYYY-MM-DD DayOfWeek", "DayOfWeek" 是 "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday".中的一个
Examples
Input
1730 1740 1750 1751 -1
Output
2004-09-26 Sunday 2004-10-06 Wednesday 2004-10-16 Saturday 2004-10-17 Sunday
Solution C
#include "stdio.h" int n,year,month,day; int count_year(int x) { if ((((year%4)==0)&&(year%100!=0))||(year%400==0)) return (366); else return (365); } int count_month(int x,int y) { int t; switch (month) { case 1 : case 3 : case 5 : case 7 : case 8 : case 10 : case 12 : t=31;break; case 2 : { t=28; if ((((y%4)==0)&&(y%100!=0))||(y%400==0)) t=29; break; } default :t=30; } return(t); } void work() { int sum=n; year=2000; month=1; day=1; while (n>364) { if (n<count_year(year)) break; n=n-count_year(year); year++; } while (n>28) { if (n<count_month(month,year)) break; n=n-count_month(month,year); month++; } day=day+n; printf("%d-",year); if (month<10) printf("0"); printf("%d-",month); if (day<10) printf("0"); printf("%d ",day); switch(sum-(sum/7)*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; } } void main() { while (1) { scanf("%d",&n); if (n==-1) break; work(); } }
Solution C++
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <algorithm> #include <map> #include <queue> #include <stack> #include <iostream> using namespace std; int leapyear(int year) { if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) return 1; return 0; } int monthofday(int month, int year) { if(month == 2) { if(leapyear(year) == 1) return 29; else return 28; } if(month % 2 == 0) { if(month <= 7) return 30; else return 31; } else { if(month > 7) return 30; else return 31; } } int main () { //freopen("A.in", "r", stdin); //freopen("A.out", "w", stdout); int n, m, i, j, k, len; int leap[2] = {365,366}; char DayOfWeek[7][10] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; while(scanf("%d",&n) && n != -1) { int nn = n; int y = 2000, m = 1, d = 1; while(n >= leap[leapyear(y)]) { n -= leap[leapyear(y)]; y ++; } for(m = 1 ; m <= 12 ; m ++) { if(n >= monthofday(m,y)) n -= monthofday(m,y); else break; } for(d = 1 ; d < monthofday(m,y); d ++) { if(n > 0) n --; else break; } int mm = m /10; int dd = d / 10; printf("%d-%d%d-%d%d %s\n",y,mm,m%10,dd,d%10,DayOfWeek[(6+nn%7)%7]); } return 0; }