Advertisement
taiberium

Untitled

Sep 22nd, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdbool.h>
  5.  
  6. const int size = 30;
  7. const int doubleSize = size * 2; // res should be twice bigger than input so we dont loose digits
  8.  
  9. struct BigDecimal {
  10.  
  11.     int size;
  12.     int digits[doubleSize];
  13.     int E;
  14.     int sign;
  15.  
  16. };
  17.  
  18. void printArrayResult(int *res, int size) {
  19.     for (int j = 0; j < size; j++) {
  20.         printf("Element[%d] = %d\n", j, res[j]);
  21.     }
  22. }
  23.  
  24. void printNumber(int num) {
  25.     printf("Number = %d\n", num);
  26. }
  27.  
  28. int compare(int *a, int *b, int arraySize, int index) {
  29.  
  30.     int val1 = a[index];
  31.     int val2 = b[index];
  32.  
  33.     if (val1 == val2) {
  34.         return compare(a, b, arraySize, index + 1);
  35.     }
  36.  
  37.     if (val1 > val2) {
  38.         return 1;
  39.     } else {
  40.         return -1;
  41.     }
  42. }
  43.  
  44. void minus(int array1[], int array2[], int size, int returnArray[]) {
  45.  
  46.     int borrow = -1;
  47.  
  48.     for (int i = size - 1; i >= 0; i--) {
  49.  
  50.         if (array1[i] < array2[i]) {
  51.             borrow = i - 1;
  52.             array1[i] += 10;
  53.         }
  54.  
  55.         int res = array1[i] - array2[i];
  56.         if (borrow == i) {
  57.             borrow = -1;
  58.             res--;
  59.         }
  60.         returnArray[i] = res;
  61.     }
  62. }
  63.  
  64. void incrementResult(int resultArray[], int index) {
  65.  
  66.     resultArray[index]++;
  67.     if (resultArray[index] >= 10) {
  68.         incrementResult(resultArray, index - 1);
  69.         resultArray[index] -= 10;
  70.     }
  71. }
  72.  
  73. void divide(int array1[], int array2[], int size, int returnArray[]) {
  74.  
  75.     int compareResult = 0;
  76.     do {
  77.  
  78.         incrementResult(returnArray, size - 1);
  79.  
  80.         minus(array1, array2, size, array1);
  81.         //printArrayResult(array1, size);
  82.         compareResult = compare(array1, array2, size, 0);
  83.       //  printNumber(compareResult);
  84.  
  85.     } while (compareResult > 0);
  86.  
  87. }
  88.  
  89. struct BigDecimal normalize(struct BigDecimal decimal, int shift) {
  90.  
  91.     struct BigDecimal res = {.sign = decimal.sign};
  92.     res.size = doubleSize;
  93.  
  94.     int e = decimal.E;
  95.  
  96.     for (int i = 0; i < res.size; i++) {
  97.         int offset = i - shift;
  98.         if (offset < decimal.size && offset >= 0) {
  99.             res.digits[i] = decimal.digits[offset];
  100.         } else {
  101.             res.digits[i] = 0;
  102.             e--;
  103.         }
  104.     }
  105.     e += shift;
  106.     res.E = e;
  107.  
  108.     return res;
  109. }
  110.  
  111. struct BigDecimal denormalize(struct BigDecimal decimal) {
  112.  
  113.     int leftZero = 0;
  114.     int rightZero = 0;
  115.  
  116.     for (int i = 0; i < decimal.size; i++) {
  117.         if (decimal.digits[i] == 0) {
  118.             leftZero++;
  119.         } else {
  120.             break;
  121.         }
  122.     }
  123.  
  124.     for (int i = decimal.size - 1; i >= 0; i--) {
  125.         if (decimal.digits[i] == 0) {
  126.             rightZero++;
  127.         } else {
  128.             break;
  129.         }
  130.     }
  131.  
  132.     struct BigDecimal res = {
  133.             .size = decimal.size - (leftZero + rightZero),
  134.             .sign = decimal.sign,
  135.             .E = decimal.E + rightZero
  136.     };
  137.  
  138.     for (int j = leftZero; j < decimal.size - rightZero; ++j) {
  139.         res.digits[j - leftZero] = decimal.digits[j];
  140.     }
  141.  
  142.     return res;
  143. }
  144.  
  145.  
  146. struct BigDecimal floatingDivide(struct BigDecimal val1, struct BigDecimal val2) {
  147.  
  148.     struct BigDecimal result = {
  149.             .sign = val1.sign * val2.sign,
  150.             .size = doubleSize
  151.     };
  152.  
  153.     struct BigDecimal normVal1 = normalize(val1, 0);
  154.     struct BigDecimal normVal2 = normalize(val2, 1);
  155.  
  156.     result.E = normVal1.E - normVal2.E;
  157.     divide(normVal1.digits, normVal2.digits, doubleSize, result.digits);
  158.  
  159.     struct BigDecimal denormResult = denormalize(result);
  160.    
  161.     return denormResult;
  162. }
  163.  
  164. int main() {
  165.  
  166.     struct BigDecimal number1 = {
  167.             .size = 5,
  168.             .E = 0,
  169.             .sign = 1,
  170.             .digits = {0, 4, 5, 0, 0}
  171.     };
  172.  
  173.     struct BigDecimal number2 = {
  174.             .size = 1,
  175.             .E = 0,
  176.             .sign = 1,
  177.             .digits = {5}
  178.     };
  179.  
  180.     struct BigDecimal number3 = floatingDivide(number1, number2);
  181.     printNumber(number3.E);
  182.     printArrayResult(number3.digits, number3.size);
  183.  
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement