1. 程式人生 > >考研複試專用演算法筆記(二)

考研複試專用演算法筆記(二)

二、日期部分

計算某個日期是這年第多少天(清華大學機試 )

思路:用空間換時間,使用預處理(也就是在沒有輸入的情況下先準備出所有可能結果),先把這一年每一天到這年元旦的天數放出來,有輸出時只需輸出對應的天數,時間複雜度為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 本應輸出一個數值, 結果給輸出“一串奇怪數字”,可能是你把輸出語句中加了&,輸出的是這個數值的地址。

日期類問題,主要就是考慮到閏年的問題,仔細思考可破。