POJ 2080 Calendar(很水的模拟)

时间:2021-03-31 14:39:18

刚开始一直WA,才发现原来代码中两处减去年份、月份的天数的判断条件用的是>=,虽然最后考虑n=0要退回一天的情况,但还是WA。后来改成>的条件判断,省去了考虑n=0的麻烦,AC。

此题无非就是考虑平年、闰年,月底月末,年底年末的情况。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cstring>
#include <stdlib.h> using namespace std;
char strd[][],strm[][];
char week[][]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
int month[]={,,,,,,,,,,,,};
int year[]={,};
struct Cal {
int y,m,d;
} cal; int isRun(int n){
if((n%== && n%!=)||(n%==))
return ;
return ;
}
int main() {
int n,y,m,d;//y:年,m:月,d:周几
while(scanf("%d",&n)!=EOF) {
if(n==-)
break;
d=n%;//2000.01.01为星期六
n++;
y=m=;
//如果写成>=,还要考虑当n刚好为365、366时要退回一天的情况
while(n>year[isRun(+y)]) {
n-=year[isRun(+y)];
y++;
} y+=;
if(isRun(y))
month[]++;
int i;
for(i=; i<=; i++) {
//改成n>month[i],即可不用考虑当n=0要退回一天的情况
if(n>month[i]) {
n-=month[i];
}
else
break;
} m=i;
if(month[]==)
month[]--;
cout<<y<<"-"<<(m<?"":"")<<m<<"-"<<(n<?"":"")<<n<<" "<<week[d]<<endl; }
return ;
}