Advertisement
Vladislav_Bezruk

Some task

Oct 3rd, 2021
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.93 KB | None | 0 0
  1. #include<iostream>
  2. #define maxSize 10
  3. using namespace std;
  4.  
  5. struct NUM {
  6.     int sign = 1;
  7.     int data [maxSize] = {0};
  8. };
  9. NUM diff(NUM a, NUM b);
  10. NUM sum(NUM a, NUM b);
  11.  
  12. void printNum(NUM number) {
  13.     if(number.sign == -1) {
  14.         cout<<"-";
  15.     }
  16.     bool flag = false;
  17.     for(int i = 0; i < maxSize; i++) {
  18.         if(number.data[i]!=0) {
  19.             flag = true;
  20.         }
  21.         if(flag == true) {
  22.             cout<<number.data[i];
  23.         }
  24.     }
  25.     if(flag == false) {
  26.         cout<<"0";
  27.     }
  28. }
  29. NUM convertToNum(string s) {
  30.     NUM number;
  31.     int i = 0;
  32.     if(s[0]=='-') {
  33.         number.sign = -1;
  34.         i = 1;
  35.     } else {
  36.         number.sign = 1;
  37.     }
  38.     for(i; i < s.size(); i++) {
  39.         number.data[maxSize - s.size() + i] = s[i] - '0';
  40.     }
  41.     return number;
  42. }
  43.  
  44. NUM sum(NUM a, NUM b) {
  45.     NUM c;
  46.     if(a.sign==b.sign) {
  47.         for(int i = maxSize - 1; i >= 0; i--) {
  48.             c.data[i] = c.data[i]+a.data[i]+b.data[i];
  49.             if(c.data[i]>9) {
  50.                 c.data[i]-=10;
  51.                 c.data[i-1] = 1;
  52.             }
  53.         }
  54.         c.sign = a.sign;
  55.     }
  56.     if(a.sign!=b.sign) {
  57.         a.sign*= -1;
  58.         c = diff(a, b);
  59.         c.sign*= -1;
  60.     }
  61.  
  62.     return c;
  63. }
  64.  
  65. int compareNum(NUM a, NUM b) {
  66.     if(a.sign == 1 && b.sign ==-1) {
  67.         return 1;
  68.     }
  69.     if(a.sign == -1 && b.sign == 1) {
  70.         return -1;
  71.     }
  72.     for(int i = 0; i < maxSize; i++) {
  73.         if(a.sign == 1 && b.sign == 1 && a.data[i] > b.data[i] || a.sign == -1 && b.sign == -1 && a.data[i] < b.data[i]) {
  74.             return 1;
  75.         } else if(a.sign == 1 && b.sign ==1&& a.data[i] < b.data [i]||a.sign == -1 && b.sign== -1 && a.data[i] > b.data[i] ) {
  76.             return -1;
  77.         }
  78.     }
  79.     return 0;
  80. }
  81. void swap (NUM a, NUM b) {
  82.     NUM c = b;
  83.     b = a;
  84.     a = c;
  85. }
  86. NUM difHelp(NUM a, NUM b) {
  87.     NUM c;
  88.     c.sign = 1;
  89.     for(int i = maxSize -1 ; i >= 0; i--) {
  90.         c.data[i] = c.data[i]+ a.data[i] - b.data[i];
  91.         if(c.data[i] < 0) {
  92.             c.data[i] += 10;
  93.             c.data[i-1] = -1;
  94.         }
  95.     }
  96.     return c;
  97. }
  98. NUM diff( NUM a, NUM b) {
  99.     NUM c ;
  100.     if(a.sign == 1 && b.sign == 1 && compareNum(a,b) == -1 || a.sign == -1 && b.sign == -1 && compareNum(a,b) == 1 ) {
  101.         c = difHelp(a,b);
  102.         c.sign = -1;
  103.     }
  104.     if(a.sign == -1 && b.sign == 1 && compareNum(a,b) == 1 || a.sign == -1 && b.sign == 1 && compareNum (a, b) == -1) {
  105.         c = sum(a,b);
  106.         c.sign = -1;
  107.     }
  108.     if(a.sign == 1 && b.sign == -1 && compareNum(a,b) == 1 || a.sign == 1 && b.sign == -1 && compareNum (a, b) == -1) {
  109.         c = sum(a, b);
  110.         c.sign = 1;
  111.     }
  112.     if(a.sign == 1 && b.sign == 1 && compareNum(a,b) == 1 ) {
  113.         c = difHelp(a,b);
  114.         c.sign = 1;
  115.     }
  116.     if(a.sign == -1 && b.sign == -1 && compareNum(a,b) == -1 ) {
  117.         c = difHelp(b, a);
  118.         c.sign = 1;
  119.     }
  120.  
  121.     return c;
  122. }
  123. NUM mult10(NUM a) {
  124.     for(int i = 0; i <= maxSize-2; i++) {
  125.         a.data[i] = a.data[i+1];
  126.     }
  127.     a.data[maxSize-1] = 0;
  128.     return a;
  129. }
  130. NUM multShort(NUM a, int p) {
  131.     NUM c;
  132.     for(int i = maxSize - 1; i >= 1; i--) {
  133.         c.data[i] = c.data[i] + a.data[i]*p;
  134.         if(c.data[i] > 9) {
  135.             c.data[i-1] = c.data[i]/10;
  136.             c.data[i] = c.data[i]%10;
  137.         }
  138.     }
  139.     return c;
  140. }
  141. NUM mult(NUM a, NUM b) {
  142.     NUM ans, t;
  143.  
  144.     int digits = 0;
  145.     while(b.data[digits] == 0) digits++;
  146.     for(int i = maxSize - 1; i >= maxSize - digits; i-- ) {
  147.         t = multShort(a, b.data[i]);
  148.         ans = sum(ans, t);
  149.         a = mult10(a);
  150.     }
  151.     if(a.sign == b.sign) {
  152.         ans.sign = 1;
  153.     } else {
  154.         ans.sign = -1;
  155.     }
  156.     return ans;
  157. }
  158.  
  159. NUM zero() {
  160.     NUM a;
  161.     for (int i = 0; i < maxSize; i++)
  162.         a.data[i] = 0;
  163.     return a;
  164. }
  165.  
  166. NUM one() {
  167.     NUM a = zero();
  168.     a.data[maxSize - 1] = 1;
  169.     return a;
  170. }
  171.  
  172. bool isZero(NUM a) {
  173.     for (int i = 0; i < maxSize; i++) {
  174.         if (a.data[i] != 0) return false;
  175.     }
  176.     return true;
  177. }
  178.  
  179. bool isOne(NUM a) {
  180.     for (int i = 0; i < maxSize - 1; i++) {
  181.         if (a.data[i] != 0) return false;
  182.     }
  183.     return (a.data[maxSize - 1] == 1);
  184. }
  185.  
  186. NUM divByTwo(NUM a) {
  187.     for (int i = 0; i < maxSize; i++) {
  188.         if (i + 1 < maxSize)
  189.             a.data[i + 1] += 10 * (a.data[i] % 2);
  190.         a.data[i] /= 2;
  191.     }
  192.     return a;
  193. }
  194.  
  195. NUM div(NUM a, NUM b) {
  196.     NUM c;
  197.     int cmp = compareNum(a,b);
  198.     if(isZero(a)) {
  199.         return zero();
  200.     }
  201.     if(cmp == 0) {
  202.         return one();
  203.     }
  204.     if(isOne(b)) {
  205.         return a;
  206.     }
  207.  
  208.     NUM rB = a, lB = one(), mid, prevC = zero();
  209.     do {
  210.         prevC = mid;
  211.         mid = divByTwo(sum(rB, lB));
  212.         NUM res = mult(b, mid);
  213.         printNum(res);
  214.         cout << endl;
  215.         cmp = compareNum (a,res);
  216.         if(cmp == 1) {
  217.             lB = mid;
  218.         } else {
  219.             rB = mid;
  220.         }
  221.     } while(cmp && compareNum(mid, prevC));
  222.     if(a.sign == b.sign) {
  223.         mid.sign = 1;
  224.     } else {
  225.         mid.sign = -1;
  226.     }
  227.     return mid;
  228. }
  229. int main() {
  230.     NUM a = convertToNum("1902");
  231.     NUM b = convertToNum("112");
  232.     NUM c = diff(a, b);
  233.     NUM d = sum(a, b);
  234.     NUM f = mult(a, b);
  235.     NUM e = div(a, b);
  236.     printNum(a);
  237.     cout << " - ";
  238.     printNum(b);
  239.     cout << " = ";
  240.     printNum(c);
  241.     cout<<endl;
  242.     cout<<"----------------------"<<endl;
  243.     printNum(a);
  244.     cout << " + ";
  245.     printNum(b);
  246.     cout << " = ";
  247.     printNum(d);
  248.     cout<<endl;
  249.     cout<<"----------------------"<<endl;
  250.     printNum(a);
  251.     cout<<" * ";
  252.     printNum(b);
  253.     cout<<" = ";
  254.     printNum(f);
  255.     cout<<endl;
  256.     cout<<"----------------------"<<endl;
  257.     printNum(a);
  258.     cout<<" / ";
  259.     printNum(b);
  260.     cout<<" = ";
  261.     printNum(e);
  262.     return 0;
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement