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;
}