Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAXLEN 0x400
  6.  
  7. void add(char *dst, const char *src1, const char *src2);
  8. void sub(char *dst, const char *src1, const char *src2);
  9. void mul(char *dst, const char *src1, const char *src2);
  10. void pwr(char *dst, int base, int p);
  11.  
  12. int main(int argc, char **argv)
  13. {
  14.     char res[MAXLEN];
  15.  
  16.     switch (argv[2][0]) {
  17.     case '+': add(res, argv[1], argv[3]); break;
  18.     case '-': sub(res, argv[1], argv[3]); break;
  19.     case 'x': mul(res, argv[1], argv[3]); break;
  20.     case '^': pwr(res, atoi(argv[1]), atoi(argv[3])); break;
  21.     }
  22.     puts(res);
  23. }
  24.  
  25. enum {Add, Sub, Mul};
  26.  
  27. void arith(int op, char *dst, const char *src1, const char *src2);
  28.  
  29. void atob(int *dst, const char *src);
  30. void btoa(char *dst, const int *src);
  31.  
  32. void add_(int *dst, const int *src1, const int *src2);
  33. void sub_(int *dst, const int *src1, const int *src2);
  34. void mul_(int *dst, const int *src1, const int *src2);
  35. void pwr_(int *dst, int base, int p);
  36.  
  37. void add(char *dst, const char *src1, const char *src2)
  38. {
  39.     arith(Add, dst, src1, src2);
  40. }
  41.  
  42. void sub(char *dst, const char *src1, const char *src2)
  43. {
  44.     arith(Sub, dst, src1, src2);
  45. }
  46.  
  47. void mul(char *dst, const char *src1, const char *src2)
  48. {
  49.     arith(Mul, dst, src1, src2);
  50. }
  51.  
  52. void pwr(char *dst, int base, int p)
  53. {
  54.     int _dst[MAXLEN/8];
  55.  
  56.     pwr_(_dst, base, p);
  57.  
  58.     btoa(dst, _dst);
  59. }
  60.  
  61. void arith(int op, char *dst, const char *src1, const char *src2)
  62. {
  63.     int sign = 0;
  64.  
  65.     if (op == Mul) {
  66.         if (*src1 == '-' && ++src1) op = !op, sign = !sign;
  67.         if (*src2 == '-' && ++src2) op = !op;
  68.     } else {
  69.         if (*src1 == '-' && ++src1) sign = !sign;
  70.         if (*src2 == '-' && ++src2) sign = !sign;
  71.     }
  72.  
  73.     while (*src1 == '0') ++src1;
  74.     while (*src2 == '0') ++src2;
  75.  
  76.     if (op == Sub) {
  77.         int l1, l2;
  78.         l1 = strlen(src1);
  79.         l2 = strlen(src2);
  80.         if (l1 < l2 || l1 == l2 && strcmp(src1, src2) < 0) {
  81.             const char *src_;
  82.             src_ = src1;
  83.             src1 = src2;
  84.             src2 = src_;
  85.             sign = !sign;
  86.         }
  87.     }
  88.  
  89.     int _dst[MAXLEN/8],
  90.         _src1[MAXLEN/8],
  91.         _src2[MAXLEN/8];
  92.  
  93.     atob(_src1, src1);
  94.     atob(_src2, src2);
  95.  
  96.     static void (*func[])(int *, const int *, const int *) = { add_,
  97.                                                                sub_,
  98.                                                                mul_ };
  99.     func[op](_dst, _src1, _src2);
  100.  
  101.     if (sign) btoa(dst+1, _dst), *dst = '-';
  102.          else btoa(dst  , _dst);
  103. }
  104.  
  105. void add_(int *dst, const int *src1, const int *src2)
  106. {
  107.     int r, car, s1, s2, v;
  108.  
  109.     for (r = 0, car = 0, s1 = 1, s2 = 1; s1 || s2; ++r)
  110.     {
  111.         if (s1 && src1[r] == -1) s1 = 0;
  112.         if (s2 && src2[r] == -1) s2 = 0;
  113.  
  114.         v = (s1 ? src1[r] : 0) + (s2 ? src2[r] : 0) + car;
  115.         dst[r] = v % 1000000000;
  116.         car = v / 1000000000;
  117.     }
  118.     while (r-- && !dst[r]);
  119.     dst[r+1] = -1;
  120. }
  121.  
  122. void sub_(int *dst, const int *src1, const int *src2)
  123. {
  124.     int r, car, s1, s2, v;
  125.  
  126.     for (r = 0, car = 0, s1 = 1, s2 = 1; s1 || s2; ++r)
  127.     {
  128.         if (s1 && src1[r] == -1) s1 = 0;
  129.         if (s2 && src2[r] == -1) s2 = 0;
  130.  
  131.         v = (s1 ? src1[r] : 0) - (s2 ? src2[r] : 0) - car;
  132.         dst[r] = (1000000000 + v) % 1000000000;
  133.         car = v < 0;
  134.     }
  135.     while (r-- && !dst[r]);
  136.     dst[r+1] = -1;
  137. }
  138.  
  139. void mul_(int *dst, const int *src1, const int *src2)
  140. {
  141.     int buf0[MAXLEN/8],
  142.         buf1[MAXLEN/8],
  143.         buf2[MAXLEN/8],
  144.         *_dst  = buf0,
  145.         *_src1 = buf1,
  146.         *_src2 = buf2,
  147.         *_tmp;
  148.  
  149.     long long r1, r2, car, v;
  150.  
  151.     _dst[0] = -1;
  152.  
  153.     for (r1 = 0; src1[r1] != -1; ++r1) {
  154.         _tmp  = _src1;
  155.         _src1 = _dst;
  156.         _dst  = _tmp;
  157.  
  158.         memset(_src2, 0, r1 * sizeof(int));
  159.         for (r2 = 0, car = 0; src2[r2] != -1; ++r2) {
  160.             v = (long long )src1[r1] * (long long )src2[r2] + car;
  161.             _src2[r1+r2] = v % 1000000000;
  162.             car = v / 1000000000;
  163.         }
  164.         if (car) _src2[r1+r2++] = car;
  165.         _src2[r1+r2] = -1;
  166.  
  167.         add_(_dst, _src1, _src2);
  168.     }
  169.     while ((*dst++ = *_dst++) != -1);
  170. }
  171.  
  172. void pwr_(int *dst, int base, int p)
  173. {
  174.     int buf[MAXLEN/8], m;
  175.  
  176.     dst[0] =  1;
  177.     dst[1] = -1;
  178.  
  179.     buf[0] = base;
  180.     buf[1] = -1;
  181.  
  182.     while (m = p % 2, p /= 2) {
  183.         if (m) mul_(dst, dst, buf);
  184.         mul_(buf, buf, buf);
  185.     }
  186.     mul_(dst, dst, buf);
  187. }
  188.  
  189. void atob(int *dst, const char *src)
  190. {
  191.     char buf[MAXLEN];
  192.     strcpy(buf, src);
  193.  
  194.     char *p = buf + strlen(buf);
  195.     while (buf <= (p -= 9)) {
  196.         *dst++ = atoi(p);
  197.         *p = '\0';
  198.     }
  199.     *dst = atoi(buf);
  200.     dst[*dst!=0] = -1;
  201. }
  202.  
  203. void btoa(char *dst, const int *src)
  204. {
  205.     char *d = dst;
  206.     const int *s = src;
  207.  
  208.     while (*s != -1) ++s;
  209.  
  210.     if (s != src) {
  211.         sprintf(d, "%d", *--s);
  212.         d += strlen(d);
  213.         while (src < s) {
  214.             sprintf(d, "%09d", *--s);
  215.             d += 9;
  216.         }
  217.     } else strcpy(dst, "0");
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement