今年的第幾天?
時間限制:1s 空間限制:64M
題目描述
輸入年纺裁、月诫肠、日,計算該天是本年的第幾天欺缘。
輸入描述:
包括三個整數(shù)年(1<=Y<=3000)栋豫、月(1<=M<=12)、日(1<=D<=31)谚殊。
輸出描述:
輸入可能有多組測試數(shù)據(jù)丧鸯,對于每一組測試數(shù)據(jù),輸出一個整數(shù)嫩絮,代表Input中的年丛肢、月、日對應本年的第幾天剿干。
示例輸入
1990 9 20
2000 5 1
示例輸出
263
122
來源
清華大學計算機研究生機試真題
分析
日期差值問題蜂怎,預處理出所有日期與原點日期(0年1月1日)的差值,存到buf[year][month][day]中置尔。再計算輸入日期與當年1月1日的差值即可杠步。
代碼
#include <stdio.h>
#define ISYEAP(x) x % 100 != 0 && x % 4 == 0 || x % 400 == 0 ? 1 : 0
//定義宏,判斷是否是閏年榜轿,方便計算每月天數(shù)
int dayOfMonth[13][2] =
{
0,0,
31,31,
28,29,
31,31,
30,30,
31,31,
30,30,
31,31,
31,31,
30,30,
31,31,
30,30,
31,31
};//預存每月天數(shù)
struct Date
{
int Year;
int Month;
int Day;
/* C++結(jié)構(gòu)體中可以包含函數(shù)幽歼,C只能是函數(shù)指針 */
void nextDay(){
Day ++;
if(Day > dayOfMonth[Month][ISYEAP(Year)]){ //日數(shù)超過當月最大日數(shù)
Day = 1;
Month ++; //進入下一月
if(Month > 12){
Month = 1;
Year ++; //進入下一年
}
}
}
};
int buf[3002][13][32]; //保存預處理的天數(shù),耗費大量內(nèi)存谬盐,若在main函數(shù)中定義甸私,可能會出現(xiàn)棧溢出,導致程序異常終止设褐。
int Abs(int x){
return x < 0 ? -x : x;
}
int main(){
Date tmp;
int cnt = 0; //天數(shù)計數(shù)
tmp.Year = 0;
tmp.Month = 1;
tmp.Day = 1;
while(tmp.Year != 3002){
buf[tmp.Year][tmp.Month][tmp.Day] = cnt;
//保存數(shù)組下標相應日期與0年1月1日的天數(shù)差颠蕴,如buf[2020][2][2]保存的是2020年2月2日與0年1月1日的天數(shù)差
tmp.nextDay();
cnt++;
}
int d, m, y;
while(scanf("%d %d %d", &y, &m, &d) != EOF)
{
printf("%d\n", Abs(buf[y][m][d] - buf[y][1][1]) + 1);
}
return 0;
}