2 점 찾기 + 큰 정수 덧셈 ― Poj 2413 얼마나 많은 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. { 
  17.     int i, j, k, first; 
  18.  
  19.     // , a b sum ,  
  20.     for (i = strlen(a)-1, j = LAST; i >= 0; i--, j--) 
  21.     { 
  22.         sum[j] = a[i] - '0'; 
  23.     } 
  24.     for (i = strlen(b)-1, k = LAST; i >= 0; i--, k--) 
  25.     { 
  26.         sum[k] += b[i] - '0'; 
  27.     } 
  28.  
  29.     // sum  
  30.     first = j < k ? j : k; 
  31.  
  32.     //  
  33.     for (i = LAST; i >= first; i--) 
  34.     { 
  35.         sum[i-1] += sum[i] / 10; 
  36.         sum[i] = sum[i] % 10 + '0'; 
  37.     } 
  38.     // '0' 
  39.     while (sum[first] == '0' && first < LAST) 
  40.     { 
  41.         first++; 
  42.     } 
  43.     // sum  
  44.     return &sum[first]; 
  45. } 
  46.  
  47. // 485  
  48. void Fibonacci(void) 
  49. { 
  50.     memset(store, 0, sizeof(store)); 
  51.     memset(Fibs, NULL, sizeof(Fibs)); 
  52.  
  53.     strcpy(store[1], "1"); 
  54.     strcpy(store[2], "2"); 
  55.     Fibs[1] = store[1]; 
  56.     Fibs[2] = store[2]; 
  57.  
  58.     int i; 
  59.     for (i = 3; i < 485; i++) 
  60.     { 
  61.         Fibs[i] = IntAddition(Fibs[i-2], Fibs[i-1], store[i]); 
  62.     } 
  63. } 
  64.  
  65. int Compare(char *a, char *b) 
  66. { 
  67.     int lenA = strlen(a); 
  68.     int lenB = strlen(b); 
  69.  
  70.     if (lenA == lenB) 
  71.     { 
  72.         return strcmp(a, b); 
  73.     } 
  74.     return lenA > lenB ? 1 : -1; 
  75. } 
  76.  
  77. int BinarySearch(char *num, bool &flag) 
  78. { 
  79.     int low = 1; 
  80.     int high = 480; 
  81.      
  82.     while (low <= high) 
  83.     { 
  84.         int mid = (low + high) / 2; 
  85.          
  86.         int res = Compare(num, Fibs[mid]); 
  87.         if (res == 0) 
  88.         { 
  89.             flag = true; return mid; 
  90.         } 
  91.         else if (res < 0) 
  92.         { 
  93.             high = mid - 1; 
  94.         } 
  95.         else 
  96.         { 
  97.             low = mid + 1; 
  98.         } 
  99.     } 
  100.     return low; 
  101. } 
  102.  
  103. int main(void) 
  104. { 
  105.     Fibonacci(); 
  106.  
  107.     char a[MAXLEN], b[MAXLEN]; 
  108.     while (scanf("%s %s", a, b) != EOF) 
  109.     { 
  110.         if (strcmp(a, "0") == 0 && strcmp(b, "0") == 0) 
  111.         { 
  112.             break; 
  113.         } 
  114.  
  115.         bool flagLeft = false; 
  116.         bool flagRight = false; 
  117.         // a b  
  118.         // ,  
  119.         int left = BinarySearch(a, flagLeft); 
  120.         int right = BinarySearch(b, flagRight); 
  121.  
  122.         // b , 1 
  123.         if (flagRight) 
  124.         { 
  125.             printf("%d
    "
    , right - left + 1); 
  126.         } 
  127.         else 
  128.         { 
  129.             printf("%d
    "
    , right - left); 
  130.         } 
  131.     } 
  132.     return 0; 
  133. } 

좋은 웹페이지 즐겨찾기