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
Source
Recommend
lcy
用一个二维数组存放斐波那契数,第一个维表示 第几个斐波那契数,第二位是该斐波那契数属于的最大长度;
然后用查表的方式进行查询,这样的可以计算一次,其他只要知道是第几个,就可以查得該数!
View Code
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int fib[1010][300]; 5 6 void add( int *num1, int *num2, int *num3 ) 7 { 8 int i; 9 memset(num3, 0, 300 * sizeof(int)); 10 for( i = 0; i < 300; i++ ) 11 { 12 num3[i] += (num1[i] + num2[i]); 13 if( num3[i] >= 10 ) 14 { 15 num3[i+1]++; 16 num3[i] = num3[i] % 10; 17 } 18 } 19 } 20 21 int main(int argc, char *argv[]) 22 { 23 int i,n, pi; 24 //printf( "00\n" ); 25 26 memset(fib[1],0,300*sizeof(int)); 27 memset(fib[2],0,300*sizeof(int)); 28 29 fib[1][0] = 1; 30 fib[2][0] = 1; 31 for( i = 3; i <= 1000; i++ ) 32 add(fib[i-1], fib[i-2], fib[i]); 33 scanf( "%d", &n ); 34 while( n-- ) 35 { 36 scanf("%d", &pi); 37 for( i = 299; i >= 0; i-- ) 38 if( fib[pi][i] != 0 ) 39 break; 40 for( ; i >= 0; i-- ) 41 printf( "%d", fib[pi][i] ); 42 printf( "\n" ); 43 } 44 45 // system("PAUSE"); 46 return 0; 47 }