Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.08 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char *makeLong (char *a){
  6.     char *res = malloc(256);
  7.     memset(res, 0, 256);
  8.     for (size_t i = 0, len = strlen(a); i < len; i++){
  9.         res[i] = a[len - i - 1] - '0';
  10.     }
  11.     return res;
  12. }
  13.  
  14. char *makeString (char *a){
  15.     size_t size = 256;
  16.     for (; size > 1 && a[size - 1] == 0; size--){}
  17.     char *res = malloc(size + 1);
  18.     res[size] = 0;
  19.     for (size_t i = 0; i < size; i++){
  20.         res[i] = a[size - i - 1] + '0';
  21.     }
  22.     return res;
  23. }
  24.  
  25. void sum (char *a, char *b){
  26.     for (size_t i = 0; i < 256; i++){
  27.         a[i] += b[i];
  28.         i < 255 ? a[i + 1] += a[i] / 10 : 0;
  29.         a[i] %= 10;
  30.     }
  31. }
  32.  
  33. void sub (char *a, char *b){
  34.     for (size_t i = 0; i < 256; i++){
  35.         a[i] -= b[i];
  36.         a[i] < 0 ? a[i] += 10, i < 255 ? a[i + 1]-- : 0 : 0;
  37.     }
  38. }
  39.  
  40. void mul (char *a, char *b){
  41.     int temp[256] = {0};
  42.     for (size_t i = 0; i < 256; i++){
  43.         for (size_t j = 0; j < 256; j++){
  44.             i + j < 256 ? temp[i + j] += a[i] * b[j] : 0;
  45.         }
  46.     }
  47.     for (size_t i = 0; i < 256; i++){
  48.         i < 255 ? temp[i + 1] += temp[i] / 10 : 0;
  49.         temp[i] %= 10;
  50.         a[i] = temp[i];
  51.     }
  52. }
  53.  
  54. void sdiv (char *a, char b){
  55.     if (b < 1 || b > 9){
  56.         return;
  57.     }
  58.     char temp[256] = {0};
  59.     for (size_t i = 0; i < 256; i++){
  60.         char t = temp[255 - i] * 10 + a[255 - i];
  61.         temp[255 - i] = t / b;
  62.         i < 255 ? temp[255 - i - 1] = t % b : 0;
  63.     }
  64.     memcpy(a, temp, 256);
  65. }
  66.  
  67. int less (char *a, char *b){
  68.     for (size_t i = 0; i < 256; i++){
  69.         if (a[255 - i] < b[255 - i]){
  70.             return 1;
  71.         }
  72.         if (a[255 - i] > b[255 - i]){
  73.             return 0;
  74.         }
  75.     }
  76.     return 0;
  77. }
  78.  
  79. char **divide_strings (char *a, char *b){
  80.     char **res = malloc(sizeof(char *) * 2);
  81.     char *la = makeLong(a);
  82.     char *lb = makeLong(b);
  83.     if (less(la, lb)){
  84.         res[0] = makeString(makeLong("0"));
  85.         res[1] = makeString(la);
  86.         free(la);
  87.         free(lb);
  88.         //printf("quot = %s\nrem = %s\n", res[0], res[1]);
  89.         return res;
  90.     }
  91.     char *buf = malloc(256 * 4);
  92.     char *left = buf;
  93.     memset(left, 0, 256);
  94.     char *right = buf + 256;
  95.     memcpy(right, la, 256);
  96.     char *middle = buf + 256 * 2;
  97.     memcpy(middle, la, 256);
  98.     sdiv(middle, 2);
  99.     char *temp = buf + 256 * 3;
  100.  
  101.     while (1){
  102.         memcpy(temp, middle, 256);
  103.         mul(temp, lb);
  104.         if (!less(la, temp)){
  105.             sum(temp, lb);
  106.             if (less(la, temp)){
  107.                 sub(temp, lb);
  108.                 sub(la, temp);
  109.                 break;
  110.             }
  111.             else{
  112.                 //printf("small\n");
  113.                 memcpy(temp, left, 256);
  114.                 sum(temp, middle);
  115.                 sdiv(temp, 2);
  116.                 memcpy(left, temp, 256);
  117.             }
  118.         }
  119.         else{
  120.             //printf("big\n");
  121.             memcpy(temp, right, 256);
  122.             sum(temp, middle);
  123.             sdiv(temp, 2);
  124.             memcpy(right, temp, 256);
  125.         }
  126.         memcpy(middle, right, 256);
  127.         sum(middle, left);
  128.         sdiv(middle, 2);
  129.     }
  130.  
  131.     res[0] = makeString(middle);
  132.     res[1] = makeString(la);
  133.     free(la);
  134.     free(lb);
  135.     free(buf);
  136.     //printf("quot = %s\nrem = %s\n", res[0], res[1]);
  137.     return res;
  138. }
  139.  
  140. int main (int argc, char **argv){
  141.     // char *foo = makeLong("987654321987654321987654321987654321");
  142.     // char *baz = makeLong("987654321");
  143.     // sdiv(foo, 2);
  144.     // char *bar = makeString(foo);
  145.     // printf("%s\n", bar);
  146.     // free(foo);
  147.     // free(bar);
  148.     // free(baz);
  149.  
  150.     divide_strings("729", "9");
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement