考研複試專用演算法筆記(二)
二、日期部分
計算某個日期是這年第多少天(清華大學機試 )
思路:用空間換時間,使用預處理(也就是在沒有輸入的情況下先準備出所有可能結果),先把這一年每一天到這年元旦的天數放出來,有輸出時只需輸出對應的天數,時間複雜度為O(1)。
核心程式碼:
//計算給出日期是當年第多少天
#include <stdio.h>
#define ISLeap(x) x%100!=0&&x%4==0||x%400==0?1:0
//這裡用巨集定義,全域性變數, 判斷是否是閏年
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
};
struct Date{
int Year,Day,Month;
void nextDay(){
Day++;
if(Day>dayOfMonth[Month][ISLeap(Year)]){
Day=1;
Month++;
if(Month>12){
Month=1;
Year++;
}
}
}
};
int buf[1001][13][32];
int Abs(int x){
return x<0?-x:x;
}
int main(){
int cnt=0;
Date tmp;
tmp.Year=0;
tmp.Day=1;
tmp.Month=1;
while(tmp.Year!=1001){
buf[tmp.Year][tmp.Month][tmp.Day]=cnt;
tmp.nextDay();
cnt++;
}
int y1,y2,m1,m2,d1,d2;
while(~scanf("%d%d%d",&y1,&m1,&d1)){
printf("%d\n",Abs(buf[y1][m1][d1]-buf[y1][1][1])+1);
}
return 0;
}
可能出現的基本錯誤:
1.結構體後必須有;
2.定義的基本變數,特別是陣列,賦值一堆值後別忘記加;
3.編譯錯誤 error: control may reach end of non-void function解決辦法:
這個錯誤是 因為本該有返回值的函式,可能在某種用例測試下沒有返回值,要去在某個地方加返回值。
4 本應輸出一個數值, 結果給輸出“一串奇怪數字”,可能是你把輸出語句中加了&,輸出的是這個數值的地址。
日期類問題,主要就是考慮到閏年的問題,仔細思考可破。