大菲波数
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7529 Accepted Submission(s): 2511
Problem Description
Fibonacci数列,定义如下:
f(1)=f(2)=1
f(n)=f(n-1)+f(n-2) n>=3。
计算第n项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
————————————————————————————————————
选用适合的大小作为分割的基准,我使用10000作为分割的基准
/****************************
*Name:大菲波数.c
*Tags:ACM BigNumber
****************************/
#include <stdio.h>
#include <math.h>
int main()
{
int f[1001][100];
int c, i, j, t, N, pi;
f[1][0] = 1; //0单元存储长度
f[1][1] = 1;
f[2][0] = 1; //0单元存储长度
f[2][1] = 1;
for(i = 3; i <= 1000; i++) {
for(j = 0; j < 100; j++) {
f[i][j] = 0;
}
f[i][0] = f[i-1][0];
for(j = 1; j <= f[i-1][0]; j++) {
f[i][j] += f[i-1][j];
if(f[i][j] >= 10000) {
if(j == f[i][0]) {
f[i][0] = j+1;
}
f[i][j+1] += f[i][j] / 10000;
f[i][j] %= 10000;
}
}
for(j = 1; j <= f[i-2][0]; j++) {
f[i][j] += f[i-2][j];
if(f[i][j] >= 10000) {
if(j == f[i][0]) {
f[i][0] = j+1;
}
f[i][j+1] += f[i][j] / 10000;
f[i][j] %= 10000;
}
}
if(f[i][f[i][0]] >= 10000) {
f[i][f[i][0]+1] = f[i][f[i][0]] / 10000;
f[i][f[i][0]] %= 10000;
f[i][0] += 1;
}
}
scanf("%d", &N);
while(N--) {
scanf("%d", &pi);
/*for(pi = 1; pi <= 1000; pi++) {
printf("pi = %d:%d\n", pi, f[pi][0]);
}*/
printf("%d", f[pi][f[pi][0]]);
for(i = f[pi][0]-1; i >= 1; i--) {
printf("%04d", f[pi][i]);
}
printf("\n");
}
return 0;
}