同样使用预处理, 通用方法
打印日期
#include<cstdio>
using namespace std;
int mTD[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct Date{
int y,m,d;
};
bool isLeapYear(int y){return (y%100!=0&&y%4==0)||y%400==0;}
int getDaysOfYear(int y){
return isLeapYear(y)?366:365;
}
int getDays(int y, int m){
if(m==2){
if(isLeapYear(y))return 29;
return mTD[2];
}
return mTD[m];
}
int main(){
int year,days,i,t;
while(~scanf("%d%d",&year,&days)){
i=1;
while(days>(t=getDays(year,i))){
days-=t;
i++;
}
//格式化输出:补0
printf("%.4d-%.2d-%.2d\n",year,i,days);
}
return 0;
}
今年第几天
#include<cstdio>
using namespace std;
int mTD[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
bool isLeapYear(int y) { return (y % 100 != 0 && y % 4 == 0) || y % 400 == 0; }
int getDays(int y, int m) {
if (m == 2) {
if (isLeapYear(y))return 29;
return mTD[2];
}
return mTD[m];
}
struct date {
int y, m, d;
void next() {
d++;
if (d>getDays(y, m)) {
d = 1;
++m;
}
if (m > 12) {
m = 1;
++y;
}
}
};
int buf[5001][13][32];
int main() {
//预处理
date d = { 0,1,1 };
int cnt = 1;
while (d.y != 5001) {
buf[d.y][d.m][d.d] = cnt++;
d.next();
}
//输入处理
while (~(scanf("%d%d%d", &d.y, &d.m, &d.d))) {
printf("%d\n", buf[d.y][d.m][d.d] - buf[d.y][1][1] + 1);
}
return 0;
}