neistadt

Untitled

May 22nd, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.01 KB | None | 0 0
  1. void add_or_take(int a, LongN * A){
  2.     char * s;
  3.     if(a == 1){
  4.         A->n++;
  5.         s = (char *)calloc(A->n, sizeof(char));
  6.         memcpy(s, A->dig, A->n*sizeof(char));
  7.         *(s+A->n-1) = 0;
  8.         free(A->dig);
  9.         A->dig = s;
  10.     }else{
  11.         *(A->dig + A->n - 1) = 0;
  12.         A->n--;
  13.         s = (char *)calloc(A->n, sizeof(char));
  14.         memcpy(s, A->dig, A->n*sizeof(char));
  15.         free(A->dig);
  16.         A->dig = s;
  17.     }
  18.     return;
  19. }
  20.  
  21. LongN divide_two(LongN a){
  22.     LongN A;
  23.     A.n = a.n;
  24.     A.dig = (char *)calloc(A.n, sizeof(char));
  25.     A.sign = a.sign;
  26.     memcpy(A.dig, a.dig, sizeof(char)*A.n);
  27.  
  28.     int c;
  29.     int ost = 0;
  30.     for(int i = 0; i < A.n; i++){
  31.         c = *(A.dig + A.n - i - 1) % 2;
  32.         *(A.dig + A.n - i - 1) = (100*ost + *(A.dig + A.n - i - 1))/2;
  33.         ost = c;
  34.     }
  35.     if(*(A.dig + A.n - 1) == 0){
  36.         add_or_take(0, &A);
  37.     }
  38.     return A;
  39. }
  40.  
  41. LongN times_two(LongN a){
  42.     LongN A;
  43.     int ost = 0;
  44.     int c;
  45.     A.n = a.n + 1;
  46.     A.dig = (char *)calloc(A.n, sizeof(char));
  47.     A.sign = a.sign;
  48.     memcpy(A.dig, a.dig, sizeof(char)*A.n);
  49.  
  50.     for(int i = 0; i < A.n - 1; i++){
  51.         c = ((A.dig[i] * 2) + ost) / 100;
  52.         A.dig[i] = ((A.dig[i] * 2) + ost) % 100;
  53.         ost = c;
  54.     }
  55.     if(ost == 1){
  56.         A.dig[A.n - 1] = 1;
  57.     }else{
  58.         add_or_take(0, &A);
  59.     }
  60.  
  61.     return A;
  62. }
  63.  
  64. LongN sum_dig(LongN A, LongN B){
  65.     LongN result;
  66.     int c;
  67.     int ostatok = 0;
  68.     int * k;
  69.     if(A.n > B.n){
  70.         result.n = A.n + 1;
  71.         result.dig = (char *)calloc(result.n, sizeof(char));
  72.         for(int i = 0; i < B.n; i++){
  73.             result.dig[i] = B.dig[i];
  74.         }
  75.         for(int i = 0; i < A.n; i++){
  76.             result.dig[i+1] += (result.dig[i] + A.dig[i])/100;
  77.             result.dig[i] = (result.dig[i] + A.dig[i])%100;
  78.         }
  79.     }else if(B.n > A.n){
  80.         result.n = B.n + 1;
  81.         result.dig = (char *)calloc(result.n, sizeof(char));
  82.         for(int i = 0; i < A.n; i++){
  83.             result.dig[i] = A.dig[i];
  84.         }
  85.         for(int i = 0; i < B.n; i++){
  86.             result.dig[i+1] += (result.dig[i] + B.dig[i])/100;
  87.             result.dig[i] = (result.dig[i] + B.dig[i])%100;
  88.         }
  89.     }else{
  90.         result.n = A.n + 1;
  91.         result.dig = (char *)calloc(result.n, sizeof(char));
  92.         for(int i = 0; i < A.n; i++){
  93.             result.dig[i+1] += (result.dig[i] + A.dig[i] + B.dig[i])/100;
  94.             result.dig[i] = (result.dig[i] + A.dig[i] + B.dig[i])%100;
  95.         }
  96.     }
  97.     if(result.dig[result.n-1] == 0){
  98.         add_or_take(0, &result);
  99.     }
  100.  
  101.     return result;
  102. }
  103.  
  104. LongN multLN(LongN a, LongN b){
  105.     int iter = 0;
  106.     int ost;
  107.  
  108.     LongN result;
  109.     result.dig = (char *)calloc(1, sizeof(char));
  110.     result.sign = (a.sign + b.sign) % 2;
  111.     result.n = 1;
  112.     result.dig[0] = 0;
  113.  
  114.     if(a.n >= b.n){
  115.         while((b.n != 1 || b.dig[0] != 0) && b.n != 0){
  116.             ost = *(b.dig) % 2;
  117.             b = divide_two(b);
  118.             if(ost == 1){
  119.                 result = sum_dig(result, a);
  120.             }
  121.             /*printf("----------------------------\n");
  122.             printf("iteration: %d\n", iter);
  123.             printf("ost: %d\n", ost);
  124.             printover(&a);
  125.             printover(&b);
  126.             printover(&result);
  127.             printf("----------------------------\n");*/
  128.             a = times_two(a);
  129.             iter++;
  130.         }
  131.     }else{
  132.         while((a.n != 1 || a.dig[0] != 0) && a.n != 0){
  133.             ost = *(a.dig) % 2;
  134.             a = divide_two(a);
  135.             if(ost == 1){
  136.                 result = sum_dig(result, b);
  137.             }
  138.             /*printf("----------------------------\n");
  139.             printf("iteration: %d\n", iter);
  140.             printf("ost: %d\n", ost);
  141.             printover(&a);
  142.             printover(&b);
  143.             printover(&result);
  144.             printf("----------------------------\n");*/
  145.             b = times_two(b);
  146.             iter++;
  147.         }
  148.     }
  149.     result.sign = (a.sign + b.sign) % 2;
  150.     return result;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment