已知公元2000年1月1日是星期六,计算经过n天后的年月日和星期。
由于2000年有366天,但是第一天已经过去,所以在计算时要注意2000年还剩365天。
#include<stdio.h> #include<string.h> char s[7][10]={"Saturday","Sunday","Monday","Tuesday", "Wednesday","Thursday","Friday"}; int month[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; bool isRun(int y) { bool flag = false; if(y%400==0) flag = true; else if(y%4==0 && y%100!=0) flag = true; return flag; } int main() { int n; while(scanf("%d",&n)) { if(n==-1) break; char week[10]; strcpy(week,s[n%7]); //先算出星期几 int endy,endm,endd; if(n<=365) { endy=2000; }else{ int c = n/365; //大致过了几年 n=n-365; //2000年已过 int i; for(i=2001;i<=2000+c;i++) { int days=365; if(isRun(i)) days=366; if(n<=days) break; //最后处于第i年,在该年要过n天 else n-=days; } endy = i; } int sumd = 0; if(isRun(endy)) month[2]=29; else month[2]=28; if(endy==2000) n=n+1;//由于2000年1月1号这天已过 int j; for(j=1;j<=12;j++) { if(n<=month[j]) //最终处于第j月 break; else n-=month[j]; } endm = j; endd = n; printf("%d-%02d-%02d %s\n",endy,endm,endd,week); } return 0; }