Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #define INTMAX 2147483647
- //declare classes, functions
- class Node;
- class Number;
- Node* MallocNode();
- void CreateNode(Node*, int);
- int ReadNode(Node*, int);
- void WriteNode(Node*, int, int);
- void AddtoNode(Node*, int, int);
- Node* ReturnAddr(Node*, int);
- int FindLength(Node*);
- void Check(Node*);
- void Check0(Node*);
- Number sqrt(Number);
- class Node {
- private:
- char number;
- Node* ptr;
- friend Node* MallocNode();
- friend void CreateNode(Node*, int);
- friend int ReadNode(Node*, int);
- friend void WriteNode(Node*, int, int);
- friend void AddtoNode(Node*, int, int);
- friend Node* ReturnAddr(Node*, int);
- friend int FindLength(Node*);
- friend void Check(Node*);
- friend void Check0(Node*);
- friend Number;
- friend std::istream &operator>>(std::istream &, Number &);
- friend std::ostream &operator<<(std::ostream &, Number);
- friend Number sqrt(Number);
- };
- class Number {
- public:
- void Free();
- bool operator<(const Number&);
- bool operator<(int);
- bool operator<(char *);
- bool operator>(const Number&);
- bool operator>(int);
- bool operator>(char *);
- friend std::istream &operator>>(std::istream &, Number &);
- friend std::ostream &operator<<(std::ostream &, Number);
- void operator=(const Number&);
- void operator=(int);
- void operator=(char *);
- bool operator==(const Number&);
- bool operator==(int);
- bool operator==(char *);
- bool operator!=(const Number&);
- bool operator!=(int);
- bool operator!=(char *);
- bool operator<=(const Number&);
- bool operator<=(int);
- bool operator<=(char *);
- bool operator>=(const Number&);
- bool operator>=(int);
- bool operator>=(char *);
- bool operator&&(const Number&);
- bool operator&&(int);
- bool operator&&(char *);
- bool operator||(const Number&);
- bool operator||(int);
- bool operator||(char *);
- Number operator+(const Number&);
- Number operator+(int);
- Number operator+(char *);
- void operator+=(const Number&);
- void operator+=(int);
- void operator+=(char *);
- Number operator++(int);//(*this)++
- Number& operator++();// ++(*this)
- Number operator-(const Number&);
- Number operator-(int);
- Number operator-(char *);
- void operator-=(const Number&);
- void operator-=(int);
- void operator-=(char *);
- Number operator--(int);
- Number& operator--();
- Number operator*(const Number&);
- Number operator*(int);
- Number operator*(char *);
- void operator*=(const Number&);
- void operator*=(int);
- void operator*=(char *);
- Number operator/(const Number&);
- Number operator/(int);
- Number operator/(char *);
- void operator/=(const Number&);
- void operator/=(int);
- void operator/=(char *);
- Number operator%(const Number&);
- Number operator%(int);
- Number operator%(char *);
- void operator%=(const Number&);
- void operator%=(int);
- void operator%=(char *);
- int Length();
- friend Number sqrt(Number);
- operator char();
- operator int();
- operator long long int();
- operator double();
- operator float();
- private:
- Node* Head = NULL;
- char biggerthan0 = 1;
- // biggerthan0 == 0 -> <0
- // biggerthan0 == 1 -> >= 0
- // biggerthan0 == 2 -> Unlumited
- void Reverse(int);
- void Free(Node*);
- };
- //Func about Node
- Node* ReturnAddr(Node* input, int element) {
- for (int i = 0; i < element; i++) {
- input = input->ptr;
- }
- return input;
- };
- int FindLength(Node* input) {
- int count = 0;
- while (input->ptr != NULL) {
- count++;
- input = input->ptr;
- }
- return count;
- };
- void Check(Node* input) {//check if there's a number that is bigger than 9
- int length = FindLength(input);
- int temp;
- for (int i = 0; i <= length; i++) {
- temp = ReadNode(input, 0);
- if (temp >= 10) {
- if (i == length) {
- CreateNode(ReturnAddr(input, 0), 1);
- }
- WriteNode(input, 0, temp % 10);
- AddtoNode(input, 1, temp / 10);
- }
- input = input->ptr;
- }
- };
- void Check0(Node* input) {
- Node* tempN;
- int MaxLength = FindLength(input);
- for (int i = MaxLength; i > 0; i--) {
- if (ReadNode(input, i) == 0) {
- tempN = ReturnAddr(input, i - 1);
- free(tempN->ptr);
- tempN->ptr = NULL;
- }
- else if (ReadNode(input, i) != 0) {
- break;
- }
- }
- };
- Node* MallocNode() {
- Node* ptr = (Node*)malloc(sizeof(Node));
- ptr->number = 0;
- ptr->ptr = NULL;
- return ptr;
- };
- void CreateNode(Node* input, int quantity) {
- for (int i = 0; i < quantity; i++) {
- input->ptr = MallocNode();
- input = input->ptr;
- }
- };
- int ReadNode(Node* input, int element) {
- for (int i = 0; i < element; i++) {
- input = input->ptr;
- }
- return (int)(input->number);
- };
- void WriteNode(Node* input, int element, int value) {
- for (int i = 0; i < element; i++) {
- input = input->ptr;
- }
- input->number = value;
- };
- void AddtoNode(Node* input, int element, int value) {
- for (int i = 0; i < element; i++) {
- input = input->ptr;
- }
- input->number += value;
- };
- //Func about Number
- Number sqrt(Number input) {
- int Length, count;
- Node *NodeTemp;
- Number result, temp, temp2, temp3, number2;
- result = 0;
- number2 = 2;
- Length = input.Length();
- if (Length == 0) {
- result = 1;
- for (; result < 4; ++result) {
- temp = result * result;
- if (temp == input) {
- return result;
- }
- if (temp > input) {
- result = -1;
- return result;
- }
- }
- }
- if (Length == 1) {
- result = 3;
- for (; result < 10; ++result) {
- temp = result * result;
- if (temp == input) {
- return result;
- }
- if (temp > input) {
- result = -1;
- return result;
- }
- }
- }
- //Length > 1
- if (Length % 2 == 1) {//4 6 8...
- temp.Head = ReturnAddr(input.Head, Length - 1);
- for (int i = 1; i <= Length/2 + 1; i++) {
- for (count = 0; count <= 10; count++) {
- temp3 = result * number2;
- temp3 = temp3 + count;
- temp3 = temp3 * count;
- if (i > 1) {
- if (temp3 == temp2) {
- break;
- }
- if (temp3 > temp2) {
- count -= 1;
- break;
- }
- }
- else {
- if (temp3 == temp) {
- break;
- }
- if (temp3 > temp) {
- count -= 1;
- break;
- }
- }
- }
- temp3 = result * number2;
- temp3 = temp3 + count;
- temp3 = temp3 * count;
- if (i < Length/2 + 1) {
- if (i > 1) {
- temp2 -= temp3;
- }
- else {
- temp2 = temp - temp3;
- }
- if (i == 1 && temp2 == 0) {
- temp2.Head->number = ReadNode(input.Head, Length - i*2);
- NodeTemp = temp2.Head;
- temp2.Head = MallocNode();
- temp2.Head->ptr = NodeTemp;
- temp2.Head->number = ReadNode(input.Head, Length - i*2 - 1);
- }
- else {
- NodeTemp = temp2.Head;
- temp2.Head = MallocNode();
- temp2.Head->ptr = NodeTemp;
- temp2.Head->number = ReadNode(input.Head, Length - i*2);
- NodeTemp = temp2.Head;
- temp2.Head = MallocNode();
- temp2.Head->ptr = NodeTemp;
- temp2.Head->number = ReadNode(input.Head, Length - i*2 - 1);
- }
- if (!(i == 1 && temp2 == 0)) {
- result.Head->number = count;
- NodeTemp = result.Head;
- result.Head = MallocNode();
- result.Head->ptr = NodeTemp;
- }
- else if (i == 1 && temp2 > 0) {
- result.Head->number = count;
- }
- }
- else {
- result.Head->number = count;
- if (temp3 < temp2) {
- result = -1;
- return result;
- }
- temp3.Free();
- temp2.Free();
- }
- }
- }
- else {//3 5 7...
- int count2;
- result = 0;
- count2 = ReadNode(input.Head, Length);
- for (count = 0; count <= 4; count++) {
- temp = count * count;
- if (temp > count2) {
- count -= 1;
- break;
- }
- if (temp == count2) {
- break;
- }
- }
- if (count > 0) {
- result.Head->number = count;
- NodeTemp = result.Head;
- result.Head = MallocNode();
- result.Head->ptr = NodeTemp;
- }
- temp = count2 - count * count;
- if (temp > 0) {
- NodeTemp = temp.Head;
- temp.Head = MallocNode();
- temp.Head->ptr = NodeTemp;
- }
- temp.Head->number = ReadNode(input.Head, Length - 1);
- NodeTemp = temp.Head;
- temp.Head = MallocNode();
- temp.Head->ptr = NodeTemp;
- temp.Head->number = ReadNode(input.Head, Length - 2);
- for (int i = 1; i <= Length/2; i++) {
- Check0(temp.Head);
- for (count = 0; count <= 10; count++) {
- temp3 = result * number2;
- temp3 = temp3 + count;
- temp3 = temp3 * count;
- if (temp3 == temp) {
- break;
- }
- if (temp3 > temp) {
- count -= 1;
- break;
- }
- }
- temp3 = result * number2;
- temp3 = temp3 + count;
- temp3 = temp3 * count;
- if (i < Length/2) {
- result.Head->number = count;
- NodeTemp = result.Head;
- result.Head = MallocNode();
- result.Head->ptr = NodeTemp;
- temp -= temp3;
- if (temp > 0) {
- NodeTemp = temp.Head;
- temp.Head = MallocNode();
- temp.Head->ptr = NodeTemp;
- }
- temp.Head->number = ReadNode(input.Head, Length - i*2 - 1);
- NodeTemp = temp.Head;
- temp.Head = MallocNode();
- temp.Head->ptr = NodeTemp;
- temp.Head->number = ReadNode(input.Head, Length - i*2 - 2);
- }
- else {
- result.Head->number = count;
- if (temp3 < temp) {
- result = -1;
- }
- }
- }
- temp.Free();
- temp3.Free();
- number2.Free();
- }
- return result;
- }
- void Number::Free() {
- Free(Head);
- };
- bool Number::operator<(const Number& input) {
- Number temp;
- temp = input;
- Node* A = this->Head;
- Node* B = input.Head;
- if (A->ptr == NULL && B->ptr == NULL && A->number == 0 && B->number == 0) {
- this->biggerthan0 = 1;
- temp.biggerthan0 = 1;
- return 0;
- }
- if (this->biggerthan0 == 1 && input.biggerthan0 == 0) {
- return 0;
- }
- if (this->biggerthan0 == 0 && input.biggerthan0 == 1) {
- return 1;
- }
- int positive = 1;
- if (this->biggerthan0 == 0 && input.biggerthan0 == 0) {
- positive = 0;
- }
- int a = FindLength(A);
- int b = FindLength(B);
- if (a < b) {
- if (positive == 1)
- return 1;
- else
- return 0;
- }
- if (a > b) {
- if (positive == 1)
- return 0;
- else
- return 1;
- }
- for (int i = a; i >= 0; i--) {
- a = ReadNode(A, i);
- b = ReadNode(B, i);
- if (a < b) {
- if (positive == 1)
- return 1;
- else
- return 0;
- }
- if (a > b) {
- if (positive == 1)
- return 0;
- else
- return 1;
- }
- }
- return 0;
- };
- bool Number::operator<(int input) {
- Number temp;
- temp = input;
- return *this < temp;
- };
- bool Number::operator<(char input[]) {
- Number temp;
- temp = input;
- return *this < temp;
- };
- bool Number::operator>(const Number& input) {
- Number temp;
- temp = input;
- return temp < *this;
- };
- bool Number::operator>(int input) {
- Number temp;
- temp = input;
- return temp < *this;
- };
- bool Number::operator>(char input[]) {
- Number temp;
- temp = input;
- return temp < *this;
- };
- std::istream &operator>>(std::istream &a, Number &b) {
- b.Free();
- b.Head = MallocNode();
- Node* ptr = b.Head;
- int length = 0;
- char InputChar;
- InputChar = a.get();
- if (InputChar == '\n' || InputChar == ' ') {
- InputChar = a.get();
- }
- while (InputChar != '\n' && InputChar != ' ') {
- if (InputChar == '-') {
- b.biggerthan0 = 0;
- InputChar = a.get();
- }
- ptr->number = InputChar - '0';
- InputChar = a.get();
- if (InputChar != '\n' && InputChar != ' ') {
- CreateNode(ptr, 1);
- ptr = ptr->ptr;
- length++;
- }
- }
- b.Reverse(length);
- return a;
- };
- std::ostream &operator<<(std::ostream &a, Number b) {
- if (b.biggerthan0 == 2) {
- a << "inf";
- return a;
- }
- if (b.biggerthan0 == 0) {
- a << "-";
- }
- if (b.Head->ptr == NULL) {
- a << (int)(b.Head->number);
- }
- else {
- Node *ptr;
- ptr = b.Head;
- int length = FindLength(ptr);
- b.Reverse(length);
- while (ptr != NULL) {
- a << (int)(ptr->number);
- ptr = ptr->ptr;
- }
- b.Reverse(length);
- }
- return a;
- };
- void Number::operator=(const Number& b) {
- Free(this->Head);
- this->Head = b.Head;
- this->biggerthan0 = b.biggerthan0;
- };
- void Number::operator=(int b) {
- Free(this->Head);
- this->Head = MallocNode();
- Node* ptr = this->Head;
- if (b < 0) {
- this->biggerthan0 = 0;
- b = -b;
- }
- while (b > 0) {
- ptr->number = b % 10;
- b /= 10;
- if (b > 0) {
- CreateNode(ptr, 1);
- ptr = ptr->ptr;
- }
- }
- };
- void Number::operator=(char b[]) {
- size_t length = strlen(b);
- Free(this->Head);
- this->Head = MallocNode();
- Node* ptr = this->Head;
- while (length > 0) {
- WriteNode(ptr, 0, b[length - 1] - '0');
- length--;
- if (length > 0 && b[length - 1] != '-') {
- CreateNode(ptr, 1);
- ptr = ptr->ptr;
- }
- if (b[length - 1] == '-') {
- this->biggerthan0 = 0;
- break;
- }
- }
- };
- bool Number::operator==(const Number& b) {
- Number temp;
- temp = b;
- Node* A, *B;
- A = this->Head;
- B = temp.Head;
- unsigned int lengthA, lengthB;
- lengthA = FindLength(A);
- lengthB = FindLength(B);
- if (lengthA != lengthB)
- return 0;
- if (*this > temp || temp > *this) {
- return 0;
- }
- for (unsigned int i = 0; i <= lengthA; i++) {
- if (A->number != B->number) {
- return 0;
- }
- A = A->ptr;
- B = B->ptr;
- }
- return 1;
- };
- bool Number::operator==(int b) {
- Number temp;
- temp = b;
- return *this == temp;
- };
- bool Number::operator==(char b[]) {
- Number temp;
- temp = b;
- return *this == temp;
- };
- bool Number::operator!=(const Number& b) {
- return !(*this == b);
- };
- bool Number::operator!=(int b) {
- return !(*this == b);
- };
- bool Number::operator!=(char b[]) {
- return !(*this == b);
- };
- bool Number::operator<=(const Number& b) {
- return !(*this > b);
- };
- bool Number::operator<=(int b) {
- Number temp;
- temp = b;
- return !(*this > temp);
- };
- bool Number::operator<=(char b[]) {
- Number temp;
- temp = b;
- return !(*this > temp);
- };
- bool Number::operator>=(const Number& b) {
- return !(*this < b);
- };
- bool Number::operator>=(int b) {
- Number temp;
- temp = b;
- return !(*this < temp);
- };
- bool Number::operator>=(char b[]) {
- Number temp;
- temp = b;
- return !(*this < temp);
- };
- bool Number::operator&&(const Number& b) {
- Number temp;
- temp = b;
- if (*this != 0 && temp != 0) {
- return true;
- }
- return false;
- };
- bool Number::operator&&(int b) {
- Number temp;
- temp = b;
- return *this && temp;
- };
- bool Number::operator&&(char b[]) {
- Number temp;
- temp = b;
- return *this && temp;
- };
- bool Number::operator||(const Number& b) {
- Number temp;
- temp = b;
- if (*this != 0 || temp != 0) {
- return true;
- }
- return false;
- };
- bool Number::operator||(int b) {
- Number temp;
- temp = b;
- return *this && temp;
- };
- bool Number::operator||(char b[]) {
- Number temp;
- temp = b;
- return *this && temp;
- };
- Number Number::operator+(const Number& b) {
- Number result, temp;
- temp = b;
- if (this->biggerthan0 == 2 || b.biggerthan0 == 2) {
- result.Head = NULL;
- result.biggerthan0 = 2;
- return result;
- }
- if (*this >= 0 && temp >= 0) {
- Node *A = this->Head;
- Node *B = b.Head;
- result.Head = MallocNode();
- Node* C = result.Head;
- Node* temp = C;
- int ALength = FindLength(A);
- int BLength = FindLength(B);
- int MaxLength, tempA, tempB;
- if (BLength > ALength) {
- MaxLength = BLength;
- }
- else {
- MaxLength = ALength;
- }
- CreateNode(C, MaxLength);
- for (int i = 0; i <= MaxLength; i++) {
- if (i > ALength) {
- tempA = 0;
- }
- else {
- tempA = ReadNode(A, i);
- }
- if (i > BLength) {
- tempB = 0;
- }
- else {
- tempB = ReadNode(B, i);
- }
- WriteNode(temp, 0, tempA + tempB);
- temp = temp->ptr;
- }
- Check(C);
- }
- else if (*this >= 0 && temp < 0) {
- temp.biggerthan0 = 1;
- result = *this - temp;
- temp.biggerthan0 = 0;
- }
- else if (*this < 0 && temp >= 0) {
- this->biggerthan0 = 1;
- result = temp - *this;
- this->biggerthan0 = 0;
- }
- else if (*this < 0 && temp < 0) {
- this->biggerthan0 = 1;
- temp.biggerthan0 = 1;
- result = *this + temp;
- result.biggerthan0 = 0;
- }
- return result;
- };
- Number Number::operator+(int b) {
- Number A;
- A = b;
- return *this + A;
- };
- Number Number::operator+(char b[]) {
- Number A;
- A = b;
- return *this + A;
- };
- void Number::operator+=(const Number& b) {
- *this = *this + b;
- };
- void Number::operator+=(int b) {
- *this = *this + b;
- };
- void Number::operator+=(char b[]) {
- *this = *this + b;
- };
- Number Number::operator++(int) {
- Number temp;
- temp = *this + 0;
- *this += 1;
- return temp;
- };
- Number& Number::operator++() {
- *this += 1;
- return *this;
- };
- Number Number::operator-(const Number& b) {
- Number result, temp;
- temp = b;
- if (this->biggerthan0 == 2 || b.biggerthan0 == 2) {
- result.Head = NULL;
- result.biggerthan0 = 2;
- return result;
- }
- if (*this >= 0 && temp >= 0) {
- Node *A = this->Head;
- Node *B = b.Head;
- result.Head = MallocNode();
- Node* C = result.Head;
- int ALength = FindLength(A);
- int BLength = FindLength(B);
- int MaxLength, temp, tempA, tempB;
- Node* tempN;
- if (BLength > ALength) {
- MaxLength = BLength;
- }
- else {
- MaxLength = ALength;
- }
- CreateNode(C, MaxLength);
- if (*this < b) {
- tempN = B;
- B = A;
- A = tempN;
- result.biggerthan0 = 0;
- temp = ALength;
- ALength = BLength;
- BLength = temp;
- }
- for (int i = 0; i <= MaxLength; i++) {
- if (i > ALength) {
- tempA = 0;
- }
- else {
- tempA = ReadNode(A, i);
- }
- if (i > BLength) {
- tempB = 0;
- }
- else {
- tempB = ReadNode(B, i);
- }
- AddtoNode(C, i, tempA - tempB);
- }
- for (int i = 0; i < MaxLength; i++) {
- temp = ReadNode(C, i);
- if (temp < 0) {
- WriteNode(C, i, temp + 10);
- AddtoNode(C, i + 1, -1);
- }
- }
- Check0(C);
- }
- else if (*this >= 0 && temp < 0) {
- temp.biggerthan0 = 1;
- result = *this + temp;
- temp.biggerthan0 = 0;
- }
- else if (*this < 0 && temp >= 0) {
- temp.biggerthan0 = 0;
- result = *this + temp;
- temp.biggerthan0 = 1;
- }
- else if (*this < 0 && temp < 0) {
- temp.biggerthan0 = 1;
- result = temp + *this;
- temp.biggerthan0 = 0;
- }
- return result;
- };
- Number Number::operator-(int b) {
- Number A;
- A = b;
- return *this - A;
- };
- Number Number::operator-(char b[]) {
- Number A;
- A = b;
- return *this - A;
- };
- void Number::operator-=(const Number& b) {
- *this = *this - b;
- };
- void Number::operator-=(int b) {
- *this = *this - b;
- };
- void Number::operator-=(char b[]) {
- *this = *this - b;
- };
- Number Number::operator--(int) {
- Number temp;
- temp = *this - 0;
- *this -= 1;
- return temp;
- };
- Number& Number::operator--() {
- *this -= 1;
- return *this;
- };
- Number Number::operator*(const Number& b) {
- Number temp, result;
- temp = b;
- if (temp == 0 || *this == 0) {
- result.Head = MallocNode();
- result.Head->number = 0;
- result.Head->ptr = NULL;
- return result;
- }
- if (this->biggerthan0 == 2 || b.biggerthan0 == 2) {
- result.Head = NULL;
- result.biggerthan0 = 2;
- return result;
- }
- Node *A = this->Head;
- Node *B = b.Head;
- result.Head = MallocNode();
- Node *C = result.Head;
- Node *tempI, *tempAJ, *tempBI, *tempIJ;
- int ALength, BLength, IntTemp;
- ALength = FindLength(A);
- BLength = FindLength(B);
- CreateNode(C, ALength + BLength);
- tempI = C;
- tempBI = B;
- for (int i = 0; i <= BLength; i++) {
- tempIJ = tempI;
- tempAJ = A;
- for (int j = 0; j <= ALength && tempBI->number > 0; j++) {
- IntTemp = tempAJ->number * tempBI->number;
- if (IntTemp >= 10) {
- if (tempIJ->ptr == NULL) {
- tempIJ->ptr = MallocNode();
- }
- tempIJ->number += IntTemp % 10;
- tempIJ->ptr->number += IntTemp / 10;
- }
- else {
- tempIJ->number += IntTemp;
- }
- if (tempIJ->number >= 10) {
- if (tempIJ->ptr == NULL) {
- tempIJ->ptr = MallocNode();
- }
- tempIJ->ptr->number += tempIJ->number / 10;
- tempIJ->number %= 10;
- }
- tempIJ = tempIJ->ptr;
- tempAJ = tempAJ->ptr;
- }
- tempBI = tempBI->ptr;
- tempI = tempI->ptr;
- }
- if ((*this < 0 && !(temp < 0)) || (!(*this < 0) && temp < 0)) {
- result.biggerthan0 = 0;
- }
- return result;
- };
- Number Number::operator*(int b) {
- Number temp;
- temp = b;
- return *this * temp;
- };
- Number Number::operator*(char b[]) {
- Number temp;
- temp = b;
- return *this * temp;
- };
- void Number::operator*=(const Number& b) {
- Number temp;
- temp = b;
- *this = *this * temp;
- };
- void Number::operator*=(int b) {
- *this = *this * b;
- };
- void Number::operator*=(char b[]) {
- *this = *this * b;
- };
- Number Number::operator/(const Number& b) {
- Number result, temp, temp2, j, A, B;
- Node *NodeTemp;
- int ALength, BLength, Difference;
- A = *this;
- B = b;
- result = 0;
- if (A.biggerthan0 == 2 || B == 0) {
- result.biggerthan0 = 2;
- return result;
- }
- else if (A.biggerthan0 == 0 && B.biggerthan0 == 0) {
- A.biggerthan0 = 1;
- B.biggerthan0 = 1;
- }
- else if ((A.biggerthan0 == 1 && B.biggerthan0 == 0) || (A.biggerthan0 == 0 && B.biggerthan0 == 1)) {
- A.biggerthan0 = 1;
- B.biggerthan0 = 1;
- result.biggerthan0 = 0;
- }
- else if (A < B || A == 0 || B.biggerthan0 == 2) {
- return result;
- }
- ALength = A.Length();
- BLength = B.Length();
- Difference = ALength - BLength;
- temp.Head = ReturnAddr(A.Head, Difference);
- for (int i = 0; i <= Difference; i++) {
- for (j = 1; j <= 10; j++) {
- if (i == 0 && j * B > temp) {
- j = j - 1;
- result.Head->number = j;
- temp2 = temp - j * B;
- break;
- }
- else if (i > 0 && j * B > temp2) {
- j = j - 1;
- result.Head->number = j;
- temp2 = temp2 - j * B;
- break;
- }
- }
- if (i < Difference) {
- if (temp2 > 0) {
- NodeTemp = temp2.Head;
- temp2.Head = MallocNode();
- temp2.Head->ptr = NodeTemp;
- }
- temp2.Head->number = ReadNode(A.Head,Difference - i - 1);
- if (!(i == 0 && j == 0)) {
- NodeTemp = result.Head;
- result.Head = MallocNode();
- result.Head->ptr = NodeTemp;
- }
- }
- }
- temp2.Free();
- j.Free();
- return result;
- };
- Number Number::operator/(int b) {
- Number A;
- A = b;
- return *this / A;
- };
- Number Number::operator/(char b[]) {
- Number A;
- A = b;
- return *this / A;
- };
- void Number::operator/=(const Number& b) {
- *this = *this / b;
- };
- void Number::operator/=(int b) {
- *this = *this / b;
- };
- void Number::operator/=(char b[]) {
- *this = *this / b;
- };
- Number Number::operator%(const Number& b) {
- Number result, temp, temp2, j, A, B;
- Node *NodeTemp;
- int ALength, BLength, Difference;
- A = *this;
- B = b;
- result = 0;
- if (A.biggerthan0 == 2 || B == 0) {
- result.biggerthan0 = 2;
- return result;
- }
- else if (A.biggerthan0 == 0 && B.biggerthan0 == 0) {
- A.biggerthan0 = 1;
- B.biggerthan0 = 1;
- result.biggerthan0 = 0;
- }
- else if (A.biggerthan0 == 1 && B.biggerthan0 == 0) {
- B.biggerthan0 = 1;
- }
- else if (A.biggerthan0 == 0 && B.biggerthan0 == 1) {
- A.biggerthan0 = 1;
- result.biggerthan0 = 0;
- }
- else if (A < B) {
- temp2 = A + 0;
- result.Head = temp2.Head;
- return result;
- }
- ALength = A.Length();
- BLength = B.Length();
- Difference = ALength - BLength;
- temp.Head = ReturnAddr(A.Head, Difference);
- for (int i = 0; i <= Difference; i++) {
- for (j = 1; j <= 10; j++) {
- if (i == 0 && j * B > temp) {
- j = j - 1;
- result.Head->number = j;
- temp2 = temp - j * B;
- break;
- }
- else if (i > 0 && j * B > temp2) {
- j = j - 1;
- result.Head->number = j;
- temp2 = temp2 - j * B;
- break;
- }
- }
- if (i < Difference) {
- if (temp2 > 0) {
- NodeTemp = temp2.Head;
- temp2.Head = MallocNode();
- temp2.Head->ptr = NodeTemp;
- }
- temp2.Head->number = ReadNode(A.Head,Difference - i - 1);
- if (!(i == 0 && j == 0)) {
- NodeTemp = result.Head;
- result.Head = MallocNode();
- result.Head->ptr = NodeTemp;
- }
- }
- else {
- result.Head = temp2.Head;
- }
- }
- temp2.Free();
- j.Free();
- return result;
- };
- Number Number::operator%(int b) {
- Number temp;
- temp = b;
- return *this % temp;
- };
- Number Number::operator%(char b[]) {
- Number temp;
- temp = b;
- return *this % temp;
- };
- void Number::operator%=(const Number& b) {
- *this = *this % b;
- };
- void Number::operator%=(int b) {
- Number temp;
- temp = b;
- *this = *this % temp;
- };
- void Number::operator%=(char b[]) {
- Number temp;
- temp = b;
- *this = *this % temp;
- };
- void Number::Reverse(int length) {
- int j = 0;
- char temp;
- Node *input = Head;
- for (int i = length; i > length / 2; i--, j++) {
- temp = ReadNode(input, i);
- WriteNode(input, i, ReadNode(input, j));
- WriteNode(input, j, temp);
- }
- };
- void Number::Free(Node* input) {
- Node* temp;
- while (input != NULL) {
- temp = input->ptr;
- free(input);
- input = temp;
- }
- };
- int Number::Length() {
- return FindLength(Head);
- }
- Number::operator int() {
- Number b;
- b.Head = Head;
- if (b > INTMAX || b < -INTMAX) {
- return 0;
- }
- Node* ptr = b.Head;
- int result = 0;
- int MulBy10 = 1;
- result += ptr->number;
- ptr = ptr->ptr;
- while (ptr != NULL) {
- result += ptr->number * 10 * MulBy10;
- MulBy10 *= 10;
- ptr = ptr->ptr;
- }
- if (biggerthan0 == 0) {
- result *= -1;
- }
- return result;
- }
- Number::operator long long int() {
- Number b, LongLongIntMax;
- b.Head = Head;
- LongLongIntMax = "9223372036854775807";
- if (b > LongLongIntMax || b < LongLongIntMax * -1) {
- return 0;
- }
- Node *ptr = Head;
- long long int result, MulBy10;
- MulBy10 = 1;
- result = 0;
- result += ptr->number;
- ptr = ptr->ptr;
- while (ptr != NULL) {
- result += ptr->number * 10 * MulBy10;
- MulBy10 *= 10;
- ptr = ptr->ptr;
- }
- if (biggerthan0 == 0) {
- result *= -1;
- }
- return result;
- }
- Number::operator char() {
- Number b;
- b.Head = Head;
- int temp;
- temp = b;
- if (b >= 256) {
- return 0;
- }else {
- return temp;
- }
- }
- Number::operator double() {
- Number b, max;
- b.Head = Head;
- max = 1;
- for (int i = 0; i < 53; i++) {
- max *= 2;
- }
- if (b >= max || b < max * -1) {
- return 0;
- }
- Node *ptr = Head;
- double result, MulBy10;
- MulBy10 = 1;
- result = 0;
- result += ptr->number;
- ptr = ptr->ptr;
- while (ptr != NULL) {
- result += ptr->number * 10 * MulBy10;
- MulBy10 *= 10;
- ptr = ptr->ptr;
- }
- if (biggerthan0 == 0) {
- result *= -1;
- }
- return result;
- }
- Number::operator float() {
- Number b;
- b.Head = Head;
- int result;
- result = b;
- return (float)b;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement