HDU1715 大菲波數

HDU 1715 大菲波數

Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 22964 Accepted Submission(s): 8264

Problem Description
Fibonacci數列,定義如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
計算第n項Fibonacci數值。

Input
輸入第一行爲一個整數N,接下來N行爲整數Pi(1<=Pi<=1000)。

Output
輸出爲N行,每行爲對應的f(Pi)。

Sample Input

5
1
2
3
4
5

Sample Output

1
1
2
3
5

Source
2007省賽集訓隊練習賽(2)

題意

很顯然是一個斐波那契數列的題目,不過這個第1000個斐波那契數太大,long long 也存不下這麼大的數據,所以我們再寫一個正數的大數加法函數即可。

代碼

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int SIZE = 1e5;
char a1[SIZE], a2[SIZE], a3[SIZE];
char mapp[1005][SIZE];
void dashujiafa(int x, int y) {
    bool jinwei = false;
    int len1, len2, len3, m1, m2, m3;
    memset(a1, '\0', sizeof(a1));
    memset(a2, '\0', sizeof(a2));
    memset(a3, '\0', sizeof(a3));
    strcpy(a1, mapp[x]);
    strcpy(a2, mapp[y]);
    len1 = strlen(a1), len2 = strlen(a2);
    m1 = len1-1, m2 = len2-1, m3 = 0;
    for(int i = 0; i < max(len1, len2); i++) {
        int j1, j2, j3;
        if(m1 >= 0 && m2 >= 0) {
            j1 = a1[m1--]-'0';
            j2 = a2[m2--]-'0';
            j3 = j1 + j2;
            if(jinwei)
                j3++;
            if(j3 >= 10)
                jinwei = true;
            else
                jinwei = false;
            a3[m3++] = j3%10 + '0';
        } else if(m1 < 0) {
            j3 = a2[m2--]-'0';
            if(jinwei)
                j3++;
            if(j3 >= 10)
                jinwei = true;
            else
                jinwei = false;
            a3[m3++] = j3%10 + '0';
        } else if (m2 < 0) {
            j3 = a1[m1--]-'0';
            if(jinwei)
                j3++;
            if(j3 >= 10)
                jinwei = true;
            else
                jinwei = false;
            a3[m3++] = j3%10 + '0';
        }
    }
    if(jinwei)
        a3[m3++] = 1 + '0';
    len3 = strlen(a3);
    int js = 0;
    for(int i = len3-1; i >= 0; i--) {
        mapp[x+1][js++] = a3[i];
    }
}

void Fibonacci() {
    for(int i = 1; i <= 1000; i++) {
        if(i == 1) {
            mapp[i][0] = '1';
        } else if(i == 2) {
            mapp[i][0] = '1';
        }
         else {
            dashujiafa(i-1, i-2);
        }
    }
}

int main() {
    Fibonacci();
    int t;
    scanf("%d", &t);
    for(int i = 0; i < t; i++) {
        int m;
        scanf("%d", &m);
        puts(mapp[m]);
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章