二分查找+大整數加法——Poj 2413 How many Fibs?

 

  1. #include <iostream> 
  2. #include <cstdio> 
  3. #include <cstring> 
  4.  
  5. using namespace std; 
  6.  
  7. #define MAXN    500 
  8. #define MAXLEN  110 
  9. #define LAST MAXLEN-2 
  10.  
  11. char store[MAXN][MAXLEN];   //存儲MAXN個斐波那契數 
  12. char *Fibs[MAXN];       //存儲每個斐波那契數的首地址 
  13.  
  14. //大整數相加 
  15. char* IntAddition(char *a, char *b, char *sum) 
  16.     int i, j, k, first; 
  17.  
  18.     //從末位開始,把a與b對應位的和存入sum中,暫不處理進位 
  19.     for (i = strlen(a)-1, j = LAST; i >= 0; i--, j--) 
  20.     { 
  21.         sum[j] = a[i] - '0'
  22.     } 
  23.     for (i = strlen(b)-1, k = LAST; i >= 0; i--, k--) 
  24.     { 
  25.         sum[k] += b[i] - '0'
  26.     } 
  27.  
  28.     //獲取sum中結果的首位位置 
  29.     first = j < k ? j : k; 
  30.  
  31.     //處理進位 
  32.     for (i = LAST; i >= first; i--) 
  33.     { 
  34.         sum[i-1] += sum[i] / 10; 
  35.         sum[i] = sum[i] % 10 + '0'
  36.     } 
  37.     //去除前導'0' 
  38.     while (sum[first] == '0' && first < LAST) 
  39.     { 
  40.         first++; 
  41.     } 
  42.     //返回sum的首位地址 
  43.     return &sum[first]; 
  44.  
  45. //計算485個斐波那契數 
  46. void Fibonacci(void
  47.     memset(store, 0, sizeof(store)); 
  48.     memset(Fibs, NULL, sizeof(Fibs)); 
  49.  
  50.     strcpy(store[1], "1"); 
  51.     strcpy(store[2], "2"); 
  52.     Fibs[1] = store[1]; 
  53.     Fibs[2] = store[2]; 
  54.  
  55.     int i; 
  56.     for (i = 3; i < 485; i++) 
  57.     { 
  58.         Fibs[i] = IntAddition(Fibs[i-2], Fibs[i-1], store[i]); 
  59.     } 
  60.  
  61. int Compare(char *a, char *b) 
  62.     int lenA = strlen(a); 
  63.     int lenB = strlen(b); 
  64.  
  65.     if (lenA == lenB) 
  66.     { 
  67.         return strcmp(a, b); 
  68.     } 
  69.     return lenA > lenB ? 1 : -1; 
  70.  
  71. int BinarySearch(char *num, bool &flag) 
  72.     int low = 1; 
  73.     int high = 480; 
  74.      
  75.     while (low <= high) 
  76.     { 
  77.         int mid = (low + high) / 2; 
  78.          
  79.         int res = Compare(num, Fibs[mid]); 
  80.         if (res == 0) 
  81.         { 
  82.             flag = truereturn mid; 
  83.         } 
  84.         else if (res < 0) 
  85.         { 
  86.             high = mid - 1; 
  87.         } 
  88.         else 
  89.         { 
  90.             low = mid + 1; 
  91.         } 
  92.     } 
  93.     return low; 
  94.  
  95. int main(void
  96.     Fibonacci(); 
  97.  
  98.     char a[MAXLEN], b[MAXLEN]; 
  99.     while (scanf("%s %s", a, b) != EOF) 
  100.     { 
  101.         if (strcmp(a, "0") == 0 && strcmp(b, "0") == 0) 
  102.         { 
  103.             break
  104.         } 
  105.  
  106.         bool flagLeft = false
  107.         bool flagRight = false
  108.         //分別找出a和b在斐波那契數中的位置 
  109.         //當查找的數不是斐波那契數時,二分查找返回的位置是第一個比它大的斐波那契數的位置 
  110.         int left = BinarySearch(a, flagLeft); 
  111.         int right = BinarySearch(b, flagRight); 
  112.  
  113.         //當b也是斐波那契數時,要把兩位置的差值加1 
  114.         if (flagRight) 
  115.         { 
  116.             printf("%d\n", right - left + 1); 
  117.         } 
  118.         else 
  119.         { 
  120.             printf("%d\n", right - left); 
  121.         } 
  122.     } 
  123.     return 0; 

 

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