Advertisement
samuel21119

BigInteger

Mar 3rd, 2019
225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 25.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #define INTMAX  2147483647
  4. //declare classes, functions
  5. class Node;
  6. class Number;
  7. Node* MallocNode();
  8. void CreateNode(Node*, int);
  9. int ReadNode(Node*, int);
  10. void WriteNode(Node*, int, int);
  11. void AddtoNode(Node*, int, int);
  12. Node* ReturnAddr(Node*, int);
  13. int FindLength(Node*);
  14. void Check(Node*);
  15. void Check0(Node*);
  16. Number sqrt(Number);
  17.  
  18.  
  19. class Node {
  20. private:
  21.     char number;
  22.     Node* ptr;
  23.     friend Node* MallocNode();
  24.     friend void CreateNode(Node*, int);
  25.     friend int ReadNode(Node*, int);
  26.     friend void WriteNode(Node*, int, int);
  27.     friend void AddtoNode(Node*, int, int);
  28.     friend Node* ReturnAddr(Node*, int);
  29.     friend int FindLength(Node*);
  30.     friend void Check(Node*);
  31.     friend void Check0(Node*);
  32.     friend Number;
  33.     friend std::istream &operator>>(std::istream &, Number &);
  34.     friend std::ostream &operator<<(std::ostream &, Number);
  35.     friend Number sqrt(Number);
  36. };
  37.  
  38. class Number {
  39. public:
  40.     void Free();
  41.     bool operator<(const Number&);
  42.     bool operator<(int);
  43.     bool operator<(char *);
  44.     bool operator>(const Number&);
  45.     bool operator>(int);
  46.     bool operator>(char *);
  47.     friend std::istream &operator>>(std::istream &, Number &);
  48.     friend std::ostream &operator<<(std::ostream &, Number);
  49.     void operator=(const Number&);
  50.     void operator=(int);
  51.     void operator=(char *);
  52.     bool operator==(const Number&);
  53.     bool operator==(int);
  54.     bool operator==(char *);
  55.     bool operator!=(const Number&);
  56.     bool operator!=(int);
  57.     bool operator!=(char *);
  58.     bool operator<=(const Number&);
  59.     bool operator<=(int);
  60.     bool operator<=(char *);
  61.     bool operator>=(const Number&);
  62.     bool operator>=(int);
  63.     bool operator>=(char *);
  64.     bool operator&&(const Number&);
  65.     bool operator&&(int);
  66.     bool operator&&(char *);
  67.     bool operator||(const Number&);
  68.     bool operator||(int);
  69.     bool operator||(char *);
  70.     Number operator+(const Number&);
  71.     Number operator+(int);
  72.     Number operator+(char *);
  73.     void operator+=(const Number&);
  74.     void operator+=(int);
  75.     void operator+=(char *);
  76.     Number operator++(int);//(*this)++
  77.     Number& operator++();// ++(*this)
  78.     Number operator-(const Number&);
  79.     Number operator-(int);
  80.     Number operator-(char *);
  81.     void operator-=(const Number&);
  82.     void operator-=(int);
  83.     void operator-=(char *);
  84.     Number operator--(int);
  85.     Number& operator--();
  86.     Number operator*(const Number&);
  87.     Number operator*(int);
  88.     Number operator*(char *);
  89.     void operator*=(const Number&);
  90.     void operator*=(int);
  91.     void operator*=(char *);
  92.     Number operator/(const Number&);
  93.     Number operator/(int);
  94.     Number operator/(char *);
  95.     void operator/=(const Number&);
  96.     void operator/=(int);
  97.     void operator/=(char *);
  98.     Number operator%(const Number&);
  99.     Number operator%(int);
  100.     Number operator%(char *);
  101.     void operator%=(const Number&);
  102.     void operator%=(int);
  103.     void operator%=(char *);
  104.     int Length();
  105.     friend Number sqrt(Number);
  106.     operator char();
  107.     operator int();
  108.     operator long long int();
  109.     operator double();
  110.     operator float();
  111. private:
  112.     Node* Head = NULL;
  113.     char biggerthan0 = 1;
  114.     // biggerthan0 == 0 -> <0
  115.     // biggerthan0 == 1 -> >= 0
  116.     // biggerthan0 == 2 -> Unlumited
  117.     void Reverse(int);
  118.     void Free(Node*);
  119. };
  120.  
  121.  
  122.  
  123. //Func about Node
  124. Node* ReturnAddr(Node* input, int element) {
  125.     for (int i = 0; i < element; i++) {
  126.         input = input->ptr;
  127.     }
  128.     return input;
  129. };
  130. int FindLength(Node* input) {
  131.     int count = 0;
  132.     while (input->ptr != NULL) {
  133.         count++;
  134.         input = input->ptr;
  135.     }
  136.     return count;
  137. };
  138. void Check(Node* input) {//check if there's a number that is bigger than 9
  139.     int length = FindLength(input);
  140.     int temp;
  141.     for (int i = 0; i <= length; i++) {
  142.         temp = ReadNode(input, 0);
  143.         if (temp >= 10) {
  144.             if (i == length) {
  145.                 CreateNode(ReturnAddr(input, 0), 1);
  146.             }
  147.             WriteNode(input, 0, temp % 10);
  148.             AddtoNode(input, 1, temp / 10);
  149.         }
  150.         input = input->ptr;
  151.     }
  152. };
  153. void Check0(Node* input) {
  154.     Node* tempN;
  155.     int MaxLength = FindLength(input);
  156.     for (int i = MaxLength; i > 0; i--) {
  157.         if (ReadNode(input, i) == 0) {
  158.             tempN = ReturnAddr(input, i - 1);
  159.             free(tempN->ptr);
  160.             tempN->ptr = NULL;
  161.         }
  162.         else if (ReadNode(input, i) != 0) {
  163.             break;
  164.         }
  165.     }
  166. };
  167. Node* MallocNode() {
  168.     Node* ptr = (Node*)malloc(sizeof(Node));
  169.     ptr->number = 0;
  170.     ptr->ptr = NULL;
  171.     return ptr;
  172. };
  173. void CreateNode(Node* input, int quantity) {
  174.     for (int i = 0; i < quantity; i++) {
  175.         input->ptr = MallocNode();
  176.         input = input->ptr;
  177.     }
  178. };
  179. int ReadNode(Node* input, int element) {
  180.     for (int i = 0; i < element; i++) {
  181.         input = input->ptr;
  182.     }
  183.     return (int)(input->number);
  184. };
  185. void WriteNode(Node* input, int element, int value) {
  186.     for (int i = 0; i < element; i++) {
  187.         input = input->ptr;
  188.     }
  189.     input->number = value;
  190. };
  191. void AddtoNode(Node* input, int element, int value) {
  192.     for (int i = 0; i < element; i++) {
  193.         input = input->ptr;
  194.     }
  195.     input->number += value;
  196. };
  197.  
  198.  
  199.  
  200. //Func about Number
  201. Number sqrt(Number input) {
  202.     int Length, count;
  203.     Node *NodeTemp;
  204.     Number result, temp, temp2, temp3, number2;
  205.     result = 0;
  206.     number2 = 2;
  207.     Length = input.Length();
  208.     if (Length == 0) {
  209.         result = 1;
  210.         for (; result < 4; ++result) {
  211.             temp = result * result;
  212.             if (temp == input) {
  213.                 return result;
  214.             }
  215.             if (temp > input) {
  216.                 result = -1;
  217.                 return result;
  218.             }
  219.         }
  220.     }
  221.     if (Length == 1) {
  222.         result = 3;
  223.         for (; result < 10; ++result) {
  224.             temp = result * result;
  225.             if (temp == input) {
  226.                 return result;
  227.             }
  228.             if (temp > input) {
  229.                 result = -1;
  230.                 return result;
  231.             }
  232.         }
  233.     }
  234.     //Length > 1
  235.     if (Length % 2 == 1) {//4 6 8...
  236.         temp.Head = ReturnAddr(input.Head, Length - 1);
  237.         for (int i = 1; i <= Length/2 + 1; i++) {
  238.             for (count = 0; count <= 10; count++) {
  239.                 temp3 = result * number2;
  240.                 temp3 = temp3 + count;
  241.                 temp3 = temp3 * count;
  242.                 if (i > 1) {
  243.                     if (temp3 == temp2) {
  244.                         break;
  245.                     }
  246.                     if (temp3 > temp2) {
  247.                         count -= 1;
  248.                         break;
  249.                     }
  250.                 }
  251.                 else {
  252.                     if (temp3 == temp) {
  253.                         break;
  254.                     }
  255.                     if (temp3 > temp) {
  256.                         count -= 1;
  257.                         break;
  258.                     }
  259.                 }
  260.             }
  261.             temp3 = result * number2;
  262.             temp3 = temp3 + count;
  263.             temp3 = temp3 * count;
  264.             if (i < Length/2 + 1) {
  265.                 if (i > 1) {
  266.                     temp2 -= temp3;
  267.                 }
  268.                 else {
  269.                     temp2 = temp - temp3;
  270.                 }
  271.                 if (i == 1 && temp2 == 0) {
  272.                     temp2.Head->number = ReadNode(input.Head, Length - i*2);
  273.                     NodeTemp = temp2.Head;
  274.                     temp2.Head = MallocNode();
  275.                     temp2.Head->ptr = NodeTemp;
  276.                     temp2.Head->number = ReadNode(input.Head, Length - i*2 - 1);
  277.                 }
  278.                 else {
  279.                     NodeTemp = temp2.Head;
  280.                     temp2.Head = MallocNode();
  281.                     temp2.Head->ptr = NodeTemp;
  282.                     temp2.Head->number = ReadNode(input.Head, Length - i*2);
  283.                     NodeTemp = temp2.Head;
  284.                     temp2.Head = MallocNode();
  285.                     temp2.Head->ptr = NodeTemp;
  286.                     temp2.Head->number = ReadNode(input.Head, Length - i*2 - 1);
  287.                 }
  288.                 if (!(i == 1 && temp2 == 0)) {
  289.                     result.Head->number = count;
  290.                     NodeTemp = result.Head;
  291.                     result.Head = MallocNode();
  292.                     result.Head->ptr = NodeTemp;
  293.                 }
  294.                 else if (i == 1 && temp2 > 0) {
  295.                     result.Head->number = count;
  296.                 }
  297.             }
  298.             else {
  299.                 result.Head->number = count;
  300.                 if (temp3 < temp2) {
  301.                     result = -1;
  302.                     return result;
  303.                 }
  304.                 temp3.Free();
  305.                 temp2.Free();
  306.             }
  307.         }
  308.     }
  309.     else {//3 5 7...
  310.         int count2;
  311.         result = 0;
  312.         count2 = ReadNode(input.Head, Length);
  313.         for (count = 0; count <= 4; count++) {
  314.             temp = count * count;
  315.             if (temp > count2) {
  316.                 count -= 1;
  317.                 break;
  318.             }
  319.             if (temp == count2) {
  320.                 break;
  321.             }
  322.         }
  323.         if (count > 0) {
  324.             result.Head->number = count;
  325.             NodeTemp = result.Head;
  326.             result.Head = MallocNode();
  327.             result.Head->ptr = NodeTemp;
  328.         }
  329.         temp = count2 - count * count;
  330.         if (temp > 0) {
  331.             NodeTemp = temp.Head;
  332.             temp.Head = MallocNode();
  333.             temp.Head->ptr = NodeTemp;
  334.         }
  335.         temp.Head->number = ReadNode(input.Head, Length - 1);
  336.         NodeTemp = temp.Head;
  337.         temp.Head = MallocNode();
  338.         temp.Head->ptr = NodeTemp;
  339.         temp.Head->number = ReadNode(input.Head, Length - 2);
  340.         for (int i = 1; i <= Length/2; i++) {
  341.             Check0(temp.Head);
  342.             for (count = 0; count <= 10; count++) {
  343.                 temp3 = result * number2;
  344.                 temp3 = temp3 + count;
  345.                 temp3 = temp3 * count;
  346.                 if (temp3 == temp) {
  347.                     break;
  348.                 }
  349.                 if (temp3 > temp) {
  350.                     count -= 1;
  351.                     break;
  352.                 }
  353.             }
  354.             temp3 = result * number2;
  355.             temp3 = temp3 + count;
  356.             temp3 = temp3 * count;
  357.             if (i < Length/2) {
  358.                 result.Head->number = count;
  359.                 NodeTemp = result.Head;
  360.                 result.Head = MallocNode();
  361.                 result.Head->ptr = NodeTemp;
  362.  
  363.                 temp -= temp3;
  364.                 if (temp > 0) {
  365.                     NodeTemp = temp.Head;
  366.                     temp.Head = MallocNode();
  367.                     temp.Head->ptr = NodeTemp;
  368.                 }
  369.                 temp.Head->number = ReadNode(input.Head, Length - i*2 - 1);
  370.                 NodeTemp = temp.Head;
  371.                 temp.Head = MallocNode();
  372.                 temp.Head->ptr = NodeTemp;
  373.                 temp.Head->number = ReadNode(input.Head, Length - i*2 - 2);
  374.             }
  375.             else {
  376.                 result.Head->number = count;
  377.                 if (temp3 < temp) {
  378.                     result = -1;
  379.                 }
  380.             }
  381.         }
  382.         temp.Free();
  383.         temp3.Free();
  384.         number2.Free();
  385.     }
  386.     return result;
  387. }
  388. void Number::Free() {
  389.     Free(Head);
  390. };
  391. bool Number::operator<(const Number& input) {
  392.     Number temp;
  393.     temp = input;
  394.     Node* A = this->Head;
  395.     Node* B = input.Head;
  396.     if (A->ptr == NULL && B->ptr == NULL && A->number == 0 && B->number == 0) {
  397.         this->biggerthan0 = 1;
  398.         temp.biggerthan0 = 1;
  399.         return 0;
  400.     }
  401.     if (this->biggerthan0 == 1 && input.biggerthan0 == 0) {
  402.         return 0;
  403.     }
  404.     if (this->biggerthan0 == 0 && input.biggerthan0 == 1) {
  405.         return 1;
  406.     }
  407.     int positive = 1;
  408.     if (this->biggerthan0 == 0 && input.biggerthan0 == 0) {
  409.         positive = 0;
  410.     }
  411.     int a = FindLength(A);
  412.     int b = FindLength(B);
  413.     if (a < b) {
  414.         if (positive == 1)
  415.             return 1;
  416.         else
  417.             return 0;
  418.     }
  419.     if (a > b) {
  420.         if (positive == 1)
  421.             return 0;
  422.         else
  423.             return 1;
  424.     }
  425.     for (int i = a; i >= 0; i--) {
  426.         a = ReadNode(A, i);
  427.         b = ReadNode(B, i);
  428.         if (a < b) {
  429.             if (positive == 1)
  430.                 return 1;
  431.             else
  432.                 return 0;
  433.         }
  434.         if (a > b) {
  435.             if (positive == 1)
  436.                 return 0;
  437.             else
  438.                 return 1;
  439.         }
  440.     }
  441.     return 0;
  442. };
  443. bool Number::operator<(int input) {
  444.     Number temp;
  445.     temp = input;
  446.     return *this < temp;
  447. };
  448. bool Number::operator<(char input[]) {
  449.     Number temp;
  450.     temp = input;
  451.     return *this < temp;
  452. };
  453. bool Number::operator>(const Number& input) {
  454.     Number temp;
  455.     temp = input;
  456.     return temp < *this;
  457. };
  458. bool Number::operator>(int input) {
  459.     Number temp;
  460.     temp = input;
  461.     return temp < *this;
  462. };
  463. bool Number::operator>(char input[]) {
  464.     Number temp;
  465.     temp = input;
  466.     return temp < *this;
  467. };
  468. std::istream &operator>>(std::istream &a, Number &b) {
  469.     b.Free();
  470.     b.Head = MallocNode();
  471.     Node* ptr = b.Head;
  472.     int length = 0;
  473.     char InputChar;
  474.     InputChar = a.get();
  475.     if (InputChar == '\n' || InputChar == ' ') {
  476.         InputChar = a.get();
  477.     }
  478.     while (InputChar != '\n' && InputChar != ' ') {
  479.         if (InputChar == '-') {
  480.             b.biggerthan0 = 0;
  481.             InputChar = a.get();
  482.         }
  483.         ptr->number = InputChar - '0';
  484.         InputChar = a.get();
  485.         if (InputChar != '\n' && InputChar != ' ') {
  486.             CreateNode(ptr, 1);
  487.             ptr = ptr->ptr;
  488.             length++;
  489.         }
  490.     }
  491.     b.Reverse(length);
  492.     return a;
  493. };
  494. std::ostream &operator<<(std::ostream &a, Number b) {
  495.     if (b.biggerthan0 == 2) {
  496.         a << "inf";
  497.         return a;
  498.     }
  499.     if (b.biggerthan0 == 0) {
  500.         a << "-";
  501.     }
  502.     if (b.Head->ptr == NULL) {
  503.         a << (int)(b.Head->number);
  504.     }
  505.     else {
  506.         Node *ptr;
  507.         ptr = b.Head;
  508.         int length = FindLength(ptr);
  509.         b.Reverse(length);
  510.         while (ptr != NULL) {
  511.             a << (int)(ptr->number);
  512.             ptr = ptr->ptr;
  513.         }
  514.         b.Reverse(length);
  515.     }
  516.     return a;
  517. };
  518.  
  519. void Number::operator=(const Number& b) {
  520.     Free(this->Head);
  521.     this->Head = b.Head;
  522.     this->biggerthan0 = b.biggerthan0;
  523. };
  524. void Number::operator=(int b) {
  525.     Free(this->Head);
  526.     this->Head = MallocNode();
  527.     Node* ptr = this->Head;
  528.     if (b < 0) {
  529.         this->biggerthan0 = 0;
  530.         b = -b;
  531.     }
  532.     while (b > 0) {
  533.         ptr->number = b % 10;
  534.         b /= 10;
  535.         if (b > 0) {
  536.             CreateNode(ptr, 1);
  537.             ptr = ptr->ptr;
  538.         }
  539.     }
  540. };
  541. void Number::operator=(char b[]) {
  542.     size_t length = strlen(b);
  543.     Free(this->Head);
  544.     this->Head = MallocNode();
  545.     Node* ptr = this->Head;
  546.     while (length > 0) {
  547.         WriteNode(ptr, 0, b[length - 1] - '0');
  548.         length--;
  549.         if (length > 0 && b[length - 1] != '-') {
  550.             CreateNode(ptr, 1);
  551.             ptr = ptr->ptr;
  552.         }
  553.         if (b[length - 1] == '-') {
  554.             this->biggerthan0 = 0;
  555.             break;
  556.         }
  557.     }
  558. };
  559. bool Number::operator==(const Number& b) {
  560.     Number temp;
  561.     temp = b;
  562.     Node* A, *B;
  563.     A = this->Head;
  564.     B = temp.Head;
  565.     unsigned int lengthA, lengthB;
  566.     lengthA = FindLength(A);
  567.     lengthB = FindLength(B);
  568.     if (lengthA != lengthB)
  569.         return 0;
  570.     if (*this > temp || temp > *this) {
  571.         return 0;
  572.     }
  573.     for (unsigned int i = 0; i <= lengthA; i++) {
  574.         if (A->number != B->number) {
  575.             return 0;
  576.         }
  577.         A = A->ptr;
  578.         B = B->ptr;
  579.     }
  580.     return 1;
  581. };
  582. bool Number::operator==(int b) {
  583.     Number temp;
  584.     temp = b;
  585.     return *this == temp;
  586. };
  587. bool Number::operator==(char b[]) {
  588.     Number temp;
  589.     temp = b;
  590.     return *this == temp;
  591. };
  592. bool Number::operator!=(const Number& b) {
  593.     return !(*this == b);
  594. };
  595. bool Number::operator!=(int b) {
  596.     return !(*this == b);
  597. };
  598. bool Number::operator!=(char b[]) {
  599.     return !(*this == b);
  600. };
  601. bool Number::operator<=(const Number& b) {
  602.     return !(*this > b);
  603. };
  604. bool Number::operator<=(int b) {
  605.     Number temp;
  606.     temp = b;
  607.     return !(*this > temp);
  608. };
  609. bool Number::operator<=(char b[]) {
  610.     Number temp;
  611.     temp = b;
  612.     return !(*this > temp);
  613. };
  614. bool Number::operator>=(const Number& b) {
  615.     return !(*this < b);
  616. };
  617. bool Number::operator>=(int b) {
  618.     Number temp;
  619.     temp = b;
  620.     return !(*this < temp);
  621. };
  622. bool Number::operator>=(char b[]) {
  623.     Number temp;
  624.     temp = b;
  625.     return !(*this < temp);
  626. };
  627. bool Number::operator&&(const Number& b) {
  628.     Number temp;
  629.     temp = b;
  630.     if (*this != 0 && temp != 0) {
  631.         return true;
  632.     }
  633.     return false;
  634. };
  635. bool Number::operator&&(int b) {
  636.     Number temp;
  637.     temp = b;
  638.     return *this && temp;
  639. };
  640. bool Number::operator&&(char b[]) {
  641.     Number temp;
  642.     temp = b;
  643.     return *this && temp;
  644. };
  645. bool Number::operator||(const Number& b) {
  646.     Number temp;
  647.     temp = b;
  648.     if (*this != 0 || temp != 0) {
  649.         return true;
  650.     }
  651.     return false;
  652. };
  653. bool Number::operator||(int b) {
  654.     Number temp;
  655.     temp = b;
  656.     return *this && temp;
  657. };
  658. bool Number::operator||(char b[]) {
  659.     Number temp;
  660.     temp = b;
  661.     return *this && temp;
  662. };
  663. Number Number::operator+(const Number& b) {
  664.     Number result, temp;
  665.     temp = b;
  666.     if (this->biggerthan0 == 2 || b.biggerthan0 == 2) {
  667.         result.Head = NULL;
  668.         result.biggerthan0 = 2;
  669.         return result;
  670.     }
  671.     if (*this >= 0 && temp >= 0) {
  672.         Node *A = this->Head;
  673.         Node *B = b.Head;
  674.         result.Head = MallocNode();
  675.         Node* C = result.Head;
  676.         Node* temp = C;
  677.         int ALength = FindLength(A);
  678.         int BLength = FindLength(B);
  679.         int MaxLength, tempA, tempB;
  680.         if (BLength > ALength) {
  681.             MaxLength = BLength;
  682.         }
  683.         else {
  684.             MaxLength = ALength;
  685.         }
  686.         CreateNode(C, MaxLength);
  687.         for (int i = 0; i <= MaxLength; i++) {
  688.             if (i > ALength) {
  689.                 tempA = 0;
  690.             }
  691.             else {
  692.                 tempA = ReadNode(A, i);
  693.             }
  694.             if (i > BLength) {
  695.                 tempB = 0;
  696.             }
  697.             else {
  698.                 tempB = ReadNode(B, i);
  699.             }
  700.             WriteNode(temp, 0, tempA + tempB);
  701.             temp = temp->ptr;
  702.         }
  703.         Check(C);
  704.     }
  705.     else if (*this >= 0 && temp < 0) {
  706.         temp.biggerthan0 = 1;
  707.         result = *this - temp;
  708.         temp.biggerthan0 = 0;
  709.  
  710.     }
  711.     else if (*this < 0 && temp >= 0) {
  712.         this->biggerthan0 = 1;
  713.         result = temp - *this;
  714.         this->biggerthan0 = 0;
  715.     }
  716.     else if (*this < 0 && temp < 0) {
  717.         this->biggerthan0 = 1;
  718.         temp.biggerthan0 = 1;
  719.         result = *this + temp;
  720.         result.biggerthan0 = 0;
  721.     }
  722.     return result;
  723. };
  724. Number Number::operator+(int b) {
  725.     Number A;
  726.     A = b;
  727.     return *this + A;
  728. };
  729. Number Number::operator+(char b[]) {
  730.     Number A;
  731.     A = b;
  732.     return *this + A;
  733. };
  734. void Number::operator+=(const Number& b) {
  735.     *this = *this + b;
  736. };
  737. void Number::operator+=(int b) {
  738.     *this = *this + b;
  739. };
  740. void Number::operator+=(char b[]) {
  741.     *this = *this + b;
  742. };
  743. Number Number::operator++(int) {
  744.     Number temp;
  745.     temp = *this + 0;
  746.     *this += 1;
  747.     return temp;
  748. };
  749. Number& Number::operator++() {
  750.     *this += 1;
  751.     return *this;
  752. };
  753. Number Number::operator-(const Number& b) {
  754.     Number result, temp;
  755.     temp = b;
  756.     if (this->biggerthan0 == 2 || b.biggerthan0 == 2) {
  757.         result.Head = NULL;
  758.         result.biggerthan0 = 2;
  759.         return result;
  760.     }
  761.     if (*this >= 0 && temp >= 0) {
  762.         Node *A = this->Head;
  763.         Node *B = b.Head;
  764.         result.Head = MallocNode();
  765.         Node* C = result.Head;
  766.         int ALength = FindLength(A);
  767.         int BLength = FindLength(B);
  768.         int MaxLength, temp, tempA, tempB;
  769.         Node* tempN;
  770.         if (BLength > ALength) {
  771.             MaxLength = BLength;
  772.         }
  773.         else {
  774.             MaxLength = ALength;
  775.         }
  776.         CreateNode(C, MaxLength);
  777.         if (*this < b) {
  778.             tempN = B;
  779.             B = A;
  780.             A = tempN;
  781.             result.biggerthan0 = 0;
  782.             temp = ALength;
  783.             ALength = BLength;
  784.             BLength = temp;
  785.         }
  786.         for (int i = 0; i <= MaxLength; i++) {
  787.             if (i > ALength) {
  788.                 tempA = 0;
  789.             }
  790.             else {
  791.                 tempA = ReadNode(A, i);
  792.             }
  793.             if (i > BLength) {
  794.                 tempB = 0;
  795.             }
  796.             else {
  797.                 tempB = ReadNode(B, i);
  798.             }
  799.             AddtoNode(C, i, tempA - tempB);
  800.         }
  801.         for (int i = 0; i < MaxLength; i++) {
  802.             temp = ReadNode(C, i);
  803.             if (temp < 0) {
  804.                 WriteNode(C, i, temp + 10);
  805.                 AddtoNode(C, i + 1, -1);
  806.             }
  807.         }
  808.         Check0(C);
  809.     }
  810.     else if (*this >= 0 && temp < 0) {
  811.         temp.biggerthan0 = 1;
  812.         result = *this + temp;
  813.         temp.biggerthan0 = 0;
  814.     }
  815.     else if (*this < 0 && temp >= 0) {
  816.         temp.biggerthan0 = 0;
  817.         result = *this + temp;
  818.         temp.biggerthan0 = 1;
  819.     }
  820.     else if (*this < 0 && temp < 0) {
  821.         temp.biggerthan0 = 1;
  822.         result = temp + *this;
  823.         temp.biggerthan0 = 0;
  824.     }
  825.     return result;
  826. };
  827. Number Number::operator-(int b) {
  828.     Number A;
  829.     A = b;
  830.     return *this - A;
  831. };
  832. Number Number::operator-(char b[]) {
  833.     Number A;
  834.     A = b;
  835.     return *this - A;
  836. };
  837. void Number::operator-=(const Number& b) {
  838.     *this = *this - b;
  839. };
  840. void Number::operator-=(int b) {
  841.     *this = *this - b;
  842. };
  843. void Number::operator-=(char b[]) {
  844.     *this = *this - b;
  845. };
  846. Number Number::operator--(int) {
  847.     Number temp;
  848.     temp = *this - 0;
  849.     *this -= 1;
  850.     return temp;
  851. };
  852. Number& Number::operator--() {
  853.     *this -= 1;
  854.     return *this;
  855. };
  856. Number Number::operator*(const Number& b) {
  857.     Number temp, result;
  858.     temp = b;
  859.     if (temp == 0 || *this == 0) {
  860.         result.Head = MallocNode();
  861.         result.Head->number = 0;
  862.         result.Head->ptr = NULL;
  863.         return result;
  864.     }
  865.     if (this->biggerthan0 == 2 || b.biggerthan0 == 2) {
  866.         result.Head = NULL;
  867.         result.biggerthan0 = 2;
  868.         return result;
  869.     }
  870.     Node *A = this->Head;
  871.     Node *B = b.Head;
  872.     result.Head = MallocNode();
  873.     Node *C = result.Head;
  874.     Node *tempI, *tempAJ, *tempBI, *tempIJ;
  875.     int ALength, BLength, IntTemp;
  876.     ALength = FindLength(A);
  877.     BLength = FindLength(B);
  878.     CreateNode(C, ALength + BLength);
  879.     tempI = C;
  880.     tempBI = B;
  881.     for (int i = 0; i <= BLength; i++) {
  882.         tempIJ = tempI;
  883.         tempAJ = A;
  884.         for (int j = 0; j <= ALength && tempBI->number > 0; j++) {
  885.             IntTemp = tempAJ->number * tempBI->number;
  886.             if (IntTemp >= 10) {
  887.                 if (tempIJ->ptr == NULL) {
  888.                     tempIJ->ptr = MallocNode();
  889.                 }
  890.                 tempIJ->number += IntTemp % 10;
  891.                 tempIJ->ptr->number += IntTemp / 10;
  892.             }
  893.             else {
  894.                 tempIJ->number += IntTemp;
  895.             }
  896.             if (tempIJ->number >= 10) {
  897.                 if (tempIJ->ptr == NULL) {
  898.                     tempIJ->ptr = MallocNode();
  899.                 }
  900.                 tempIJ->ptr->number += tempIJ->number / 10;
  901.                 tempIJ->number %= 10;
  902.             }
  903.             tempIJ = tempIJ->ptr;
  904.             tempAJ = tempAJ->ptr;
  905.         }
  906.         tempBI = tempBI->ptr;
  907.         tempI = tempI->ptr;
  908.     }
  909.     if ((*this < 0 && !(temp < 0)) || (!(*this < 0) && temp < 0)) {
  910.         result.biggerthan0 = 0;
  911.     }
  912.     return result;
  913. };
  914. Number Number::operator*(int b) {
  915.     Number temp;
  916.     temp = b;
  917.     return *this * temp;
  918. };
  919. Number Number::operator*(char b[]) {
  920.     Number temp;
  921.     temp = b;
  922.     return *this * temp;
  923. };
  924. void Number::operator*=(const Number& b) {
  925.     Number temp;
  926.     temp = b;
  927.     *this = *this * temp;
  928. };
  929. void Number::operator*=(int b) {
  930.     *this = *this * b;
  931. };
  932. void Number::operator*=(char b[]) {
  933.     *this = *this * b;
  934. };
  935. Number Number::operator/(const Number& b) {
  936.     Number result, temp, temp2, j, A, B;
  937.     Node *NodeTemp;
  938.     int ALength, BLength, Difference;
  939.     A = *this;
  940.     B = b;
  941.     result = 0;
  942.     if (A.biggerthan0 == 2 || B == 0) {
  943.         result.biggerthan0 = 2;
  944.         return result;
  945.     }
  946.     else if (A.biggerthan0 == 0 && B.biggerthan0 == 0) {
  947.         A.biggerthan0 = 1;
  948.         B.biggerthan0 = 1;
  949.     }
  950.     else if ((A.biggerthan0 == 1 && B.biggerthan0 == 0) || (A.biggerthan0 == 0 && B.biggerthan0 == 1)) {
  951.         A.biggerthan0 = 1;
  952.         B.biggerthan0 = 1;
  953.         result.biggerthan0 = 0;
  954.     }
  955.     else if (A < B || A == 0 || B.biggerthan0 == 2) {
  956.         return result;
  957.     }
  958.  
  959.     ALength = A.Length();
  960.     BLength = B.Length();
  961.     Difference = ALength - BLength;
  962.     temp.Head = ReturnAddr(A.Head, Difference);
  963.     for (int i = 0; i <= Difference; i++) {
  964.         for (j = 1; j <= 10; j++) {
  965.             if (i == 0 && j * B > temp) {
  966.                 j = j - 1;
  967.                 result.Head->number = j;
  968.                 temp2 = temp - j * B;
  969.                 break;
  970.             }
  971.             else if (i > 0 && j * B > temp2) {
  972.                 j = j - 1;
  973.                 result.Head->number = j;
  974.                 temp2 = temp2 - j * B;
  975.                 break;
  976.             }
  977.         }
  978.         if (i < Difference) {
  979.             if (temp2 > 0) {
  980.                 NodeTemp = temp2.Head;
  981.                 temp2.Head = MallocNode();
  982.                 temp2.Head->ptr = NodeTemp;
  983.             }
  984.             temp2.Head->number = ReadNode(A.Head,Difference - i - 1);
  985.             if (!(i == 0 && j == 0)) {
  986.                 NodeTemp = result.Head;
  987.                 result.Head = MallocNode();
  988.                 result.Head->ptr = NodeTemp;
  989.             }
  990.         }
  991.     }
  992.     temp2.Free();
  993.     j.Free();
  994.     return result;
  995. };
  996. Number Number::operator/(int b) {
  997.     Number A;
  998.     A = b;
  999.     return *this / A;
  1000. };
  1001. Number Number::operator/(char b[]) {
  1002.     Number A;
  1003.     A = b;
  1004.     return *this / A;
  1005. };
  1006. void Number::operator/=(const Number& b) {
  1007.     *this = *this / b;
  1008. };
  1009. void Number::operator/=(int b) {
  1010.     *this = *this / b;
  1011. };
  1012. void Number::operator/=(char b[]) {
  1013.     *this = *this / b;
  1014. };
  1015. Number Number::operator%(const Number& b) {
  1016.     Number result, temp, temp2, j, A, B;
  1017.     Node *NodeTemp;
  1018.     int ALength, BLength, Difference;
  1019.     A = *this;
  1020.     B = b;
  1021.     result = 0;
  1022.     if (A.biggerthan0 == 2 || B == 0) {
  1023.         result.biggerthan0 = 2;
  1024.         return result;
  1025.     }
  1026.     else if (A.biggerthan0 == 0 && B.biggerthan0 == 0) {
  1027.         A.biggerthan0 = 1;
  1028.         B.biggerthan0 = 1;
  1029.         result.biggerthan0 = 0;
  1030.     }
  1031.     else if (A.biggerthan0 == 1 && B.biggerthan0 == 0) {
  1032.         B.biggerthan0 = 1;
  1033.     }
  1034.     else if (A.biggerthan0 == 0 && B.biggerthan0 == 1) {
  1035.         A.biggerthan0 = 1;
  1036.         result.biggerthan0 = 0;
  1037.     }
  1038.     else if (A < B) {
  1039.         temp2 = A + 0;
  1040.         result.Head = temp2.Head;
  1041.         return result;
  1042.     }
  1043.  
  1044.     ALength = A.Length();
  1045.     BLength = B.Length();
  1046.     Difference = ALength - BLength;
  1047.     temp.Head = ReturnAddr(A.Head, Difference);
  1048.     for (int i = 0; i <= Difference; i++) {
  1049.         for (j = 1; j <= 10; j++) {
  1050.             if (i == 0 && j * B > temp) {
  1051.                 j = j - 1;
  1052.                 result.Head->number = j;
  1053.                 temp2 = temp - j * B;
  1054.                 break;
  1055.             }
  1056.             else if (i > 0 && j * B > temp2) {
  1057.                 j = j - 1;
  1058.                 result.Head->number = j;
  1059.                 temp2 = temp2 - j * B;
  1060.                 break;
  1061.             }
  1062.         }
  1063.         if (i < Difference) {
  1064.             if (temp2 > 0) {
  1065.                 NodeTemp = temp2.Head;
  1066.                 temp2.Head = MallocNode();
  1067.                 temp2.Head->ptr = NodeTemp;
  1068.             }
  1069.             temp2.Head->number = ReadNode(A.Head,Difference - i - 1);
  1070.             if (!(i == 0 && j == 0)) {
  1071.                 NodeTemp = result.Head;
  1072.                 result.Head = MallocNode();
  1073.                 result.Head->ptr = NodeTemp;
  1074.             }
  1075.         }
  1076.         else {
  1077.             result.Head = temp2.Head;
  1078.         }
  1079.     }
  1080.     temp2.Free();
  1081.     j.Free();
  1082.     return result;
  1083. };
  1084. Number Number::operator%(int b) {
  1085.     Number temp;
  1086.     temp = b;
  1087.     return *this % temp;
  1088. };
  1089. Number Number::operator%(char b[]) {
  1090.     Number temp;
  1091.     temp = b;
  1092.     return *this % temp;
  1093. };
  1094. void Number::operator%=(const Number& b) {
  1095.     *this = *this % b;
  1096. };
  1097. void Number::operator%=(int b) {
  1098.     Number temp;
  1099.     temp = b;
  1100.     *this = *this % temp;
  1101. };
  1102. void Number::operator%=(char b[]) {
  1103.     Number temp;
  1104.     temp = b;
  1105.     *this = *this % temp;
  1106. };
  1107. void Number::Reverse(int length) {
  1108.     int j = 0;
  1109.     char temp;
  1110.     Node *input = Head;
  1111.     for (int i = length; i > length / 2; i--, j++) {
  1112.         temp = ReadNode(input, i);
  1113.         WriteNode(input, i, ReadNode(input, j));
  1114.         WriteNode(input, j, temp);
  1115.     }
  1116. };
  1117. void Number::Free(Node* input) {
  1118.     Node* temp;
  1119.     while (input != NULL) {
  1120.         temp = input->ptr;
  1121.         free(input);
  1122.         input = temp;
  1123.     }
  1124. };
  1125. int Number::Length() {
  1126.     return FindLength(Head);
  1127. }
  1128. Number::operator int() {
  1129.     Number b;
  1130.     b.Head = Head;
  1131.     if (b > INTMAX || b < -INTMAX) {
  1132.         return 0;
  1133.     }
  1134.     Node* ptr = b.Head;
  1135.     int result = 0;
  1136.     int MulBy10 = 1;
  1137.     result += ptr->number;
  1138.     ptr = ptr->ptr;
  1139.     while (ptr != NULL) {
  1140.         result += ptr->number * 10 * MulBy10;
  1141.         MulBy10 *= 10;
  1142.         ptr = ptr->ptr;
  1143.     }
  1144.     if (biggerthan0 == 0) {
  1145.         result *= -1;
  1146.     }
  1147.     return result;
  1148. }
  1149. Number::operator long long int() {
  1150.     Number b, LongLongIntMax;
  1151.     b.Head = Head;
  1152.     LongLongIntMax = "9223372036854775807";
  1153.  
  1154.     if (b > LongLongIntMax || b < LongLongIntMax * -1) {
  1155.         return 0;
  1156.     }
  1157.     Node *ptr = Head;
  1158.     long long int result, MulBy10;
  1159.     MulBy10 = 1;
  1160.     result = 0;
  1161.     result += ptr->number;
  1162.     ptr = ptr->ptr;
  1163.     while (ptr != NULL) {
  1164.         result += ptr->number * 10 * MulBy10;
  1165.         MulBy10 *= 10;
  1166.         ptr = ptr->ptr;
  1167.     }
  1168.     if (biggerthan0 == 0) {
  1169.         result *= -1;
  1170.     }
  1171.     return result;
  1172. }
  1173. Number::operator char() {
  1174.     Number b;
  1175.     b.Head = Head;
  1176.     int temp;
  1177.     temp = b;
  1178.     if (b >= 256) {
  1179.         return 0;
  1180.     }else {
  1181.         return temp;
  1182.     }
  1183. }
  1184. Number::operator double() {
  1185.     Number b, max;
  1186.     b.Head = Head;
  1187.     max = 1;
  1188.     for (int i = 0; i < 53; i++) {
  1189.         max *= 2;
  1190.     }
  1191.     if (b >= max || b < max * -1) {
  1192.         return 0;
  1193.     }
  1194.     Node *ptr = Head;
  1195.     double result, MulBy10;
  1196.     MulBy10 = 1;
  1197.     result = 0;
  1198.     result += ptr->number;
  1199.     ptr = ptr->ptr;
  1200.     while (ptr != NULL) {
  1201.         result += ptr->number * 10 * MulBy10;
  1202.         MulBy10 *= 10;
  1203.         ptr = ptr->ptr;
  1204.     }
  1205.     if (biggerthan0 == 0) {
  1206.         result *= -1;
  1207.     }
  1208.     return result;
  1209. }
  1210. Number::operator float() {
  1211.     Number b;
  1212.     b.Head = Head;
  1213.     int result;
  1214.     result = b;
  1215.     return (float)b;
  1216. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement