杭電OJ題 1715 大菲波數 解題報告

大菲波數

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數值。
 

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章