Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #define N 1000
- using namespace std;
- class InfNum {
- public:
- int to_int() {
- int res = 0;
- for (int i = N - 1; i >= 0; i--) {
- res += (*this).data[i] * pow(10, N - 1 - i);
- }
- if (sign == -1) {
- res *= -1;
- }
- return res;
- }
- InfNum operator + (InfNum & num) {
- int this_sign = this -> sign, num_sign = num.sign;
- InfNum result = sum_sign(*this, num);
- this -> sign = this_sign;
- num.sign = num_sign;
- return result;
- }
- InfNum operator - (InfNum & num) {
- int this_sign = this -> sign, num_sign = num.sign;
- InfNum result = diff_sign(*this, num);
- this -> sign = this_sign;
- num.sign = num_sign;
- return result;
- }
- InfNum operator * (InfNum & num) {
- int this_sign = this -> sign, num_sign = num.sign;
- InfNum result = mult_sign(*this, num);
- this -> sign = this_sign;
- num.sign = num_sign;
- return result;
- }
- InfNum operator / (InfNum & num) {
- int this_sign = this -> sign, num_sign = num.sign;
- InfNum result = div_sign(*this, num);
- this -> sign = this_sign;
- num.sign = num_sign;
- return result;
- }
- char in () {
- string s;
- cin >> s;
- set(s);
- return ' ';
- }
- void set(string s) {
- * this = init();
- int i = 0;
- if (s[0] == '-') {
- i++;
- sign = -1;
- } else {
- sign = 1;
- }
- for (i; i < s.size(); i++) {
- data[N - s.size() + i] = s[i] - '0';
- }
- }
- char out() {
- if (sign == -1) {
- cout << "-";
- }
- bool flag = false;
- for (int i = 0; i < N; i++) {
- if (data[i] != 0) {
- flag = true;
- }
- if (flag) {
- cout << data[i];
- }
- }
- if (!flag) {
- cout << "0";
- }
- return ' ';
- }
- private:
- int sign = 1;
- int data[N] = {
- 0
- };
- bool isZero(InfNum & num) {
- for (int i = N - 1; i >= 0; i--) {
- if (num.data[i] != 0) {
- return false;
- }
- }
- return true;
- }
- void div_by_int(InfNum & num, int int_num) {
- for (int i = 0; i < N; i++) {
- if (i + 1 < N) {
- num.data[i + 1] += (num.data[i] % int_num) * 10;
- }
- num.data[i] /= int_num;
- }
- }
- void fix_sign(InfNum & num) {
- if (isZero(num) == true) {
- num.sign = 1;
- }
- }
- void swap(InfNum & a, InfNum & b) {
- InfNum c = a;
- a = b;
- b = c;
- }
- int compare(InfNum & a, InfNum & b) {
- if (a.sign > b.sign) {
- return 1;
- }
- if (a.sign < b.sign) {
- return -1;
- }
- for (int i = 0; i < N; i++) {
- if (a.data[i] > b.data[i]) {
- return a.sign;
- } else if (a.data[i] < b.data[i]) {
- return -1 * a.sign;
- }
- }
- return 0;
- }
- InfNum sum(InfNum & a, InfNum & b) {
- InfNum c;
- for (int i = N - 1; i >= 0; i--) {
- c.data[i] = a.data[i] + b.data[i];
- }
- fix_system(c);
- return c;
- }
- InfNum diff(InfNum & a, InfNum & b) {
- InfNum c;
- for (int i = N - 1; i >= 0; i--) {
- c.data[i] = a.data[i] - b.data[i];
- }
- fix_system(c);
- return c;
- }
- void fix_system(InfNum & num) {
- for (int i = N - 1; i >= 0; i--) {
- if (i > 0) {
- if (num.data[i] > 9) {
- num.data[i - 1] += num.data[i] / 10;
- num.data[i] = num.data[i] % 10;
- }
- if (num.data[i] < 0) {
- while (num.data[i] < 0) {
- num.data[i] += 10;
- num.data[i - 1] -= 1;
- }
- }
- }
- }
- }
- InfNum mult(InfNum & a, InfNum & b) {
- InfNum c;
- for (int i = N - 1; i >= 0; i--) {
- InfNum temp;
- for (int j = N - 1; j >= 0; j--) {
- if (N - 1 - (N - 1 - i + N - 1 - j) >= 0) {
- temp.data[N - 1 - (N - 1 - i + N - 1 - j)] += a.data[i] * b.data[j];
- }
- }
- c = c + temp;
- }
- fix_system(c);
- return c;
- }
- InfNum div(InfNum & a, InfNum & b) {
- InfNum c;
- int cmp = compare(a, b);
- if (cmp == -1) {
- return init();
- }
- if (cmp == 0) {
- c.set("1");
- return c;
- }
- if (isZero(a) == true) {
- return init();
- }
- if (isZero(b) == true) {
- return init();
- }
- InfNum t;
- t.set("1");
- if (compare(b, t) == 0) {
- return a;
- }
- InfNum r_b, l_b;
- l_b.set("1");
- r_b = a;
- InfNum prev_c = init();
- do {
- prev_c = c;
- c = r_b + l_b;
- div_by_int(c, 2);
- InfNum res;
- res = b * c;
- cmp = compare(a, res);
- if (cmp == 1) {
- l_b = c;
- }
- if (cmp == -1) {
- r_b = c;
- }
- } while (cmp != 0 && compare(c, prev_c) != 0);
- return c;
- }
- InfNum sum_sign(InfNum & a, InfNum & b) {
- InfNum c;
- bool swap_flag = false;
- if (a.sign == b.sign) {
- c = sum(a, b);
- c.sign = a.sign;
- fix_sign(c);
- return c;
- } else {
- if (b.sign == 1) {
- swap(a, b);
- swap_flag = true;
- }
- b.sign = 1;
- int cmp = compare(a, b);
- if (cmp != -1) {
- c = diff(a, b);
- } else {
- c = diff(b, a);
- c.sign = -1;
- }
- }
- fix_sign(c);
- if (swap_flag == true) {
- swap(a, b);
- }
- return c;
- }
- InfNum diff_sign(InfNum & a, InfNum & b) {
- InfNum c;
- if (a.sign != b.sign) {
- c = sum(a, b);
- c.sign = a.sign;
- if (isZero(c) == true) {
- c.sign = 1;
- }
- fix_sign(c);
- return c;
- } else {
- b.sign *= -1;
- if (isZero(c) == true) {
- c.sign = 1;
- }
- return sum_sign(a, b);
- }
- return c;
- }
- InfNum mult_sign(InfNum & a, InfNum & b) {
- InfNum c = mult(a, b);
- c.sign = (a.sign * b.sign);
- return c;
- }
- InfNum div_sign(InfNum & a, InfNum & b) {
- int c_sign = a.sign * b.sign;
- a.sign = b.sign = 1;
- InfNum c = div(a, b);
- if (isZero(c) == false) {
- c.sign = c_sign;
- }
- return c;
- }
- InfNum init() {
- InfNum num;
- return num;
- }
- };
- int main() {
- InfNum a, b, c;
- cout << "Enter num a: " << a.in() << endl;
- cout << "Enter num b: " << b.in() << endl;
- c = a + b;
- cout << "a + b = " << c.out() << endl;
- //
- c = a - b;
- cout << "a - b = " << c.out() << endl;
- //
- c = a * b;
- cout << "a * b = " << c.out() << endl;
- //
- c = a / b;
- cout << "a / b = " << c.out() << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement