Example 1: Big Real Number in Text File

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    char buffer[10001];
    vector<int> a, b, c;
    int n, a_sign = 1, b_sign = 1, c_sign = 1;
    bool zero_start = true;

    ofstream log_file("log.txt", ios::out | ios::app);

    cout << "Big number calculator"
         << endl
         << "1) display only"
         << endl
         << "2) plus (+)"
         << endl
         << "3) minus (-)"
         << endl
         << "4) multiplication (*)"
         << endl
         << "5) division (/)"
         << endl
         << "Please select the operator: ";

    cin >> buffer;
    if (!isdigit(buffer[0]) || buffer[1] != '\0')
    {
        cout << "Invalid input: " << buffer << endl;
        return 0;
    }

    n = buffer[0] - '0';
    switch (n)
    {
    case 1:
        cout << "You selected: display only" << endl;
        break;
    case 2:
        cout << "You selected: +" << endl;
        break;
    case 3:
        cout << "You selected: -" << endl;
        break;
    case 4:
        cout << "You selected: *" << endl;
        break;
    case 5:
        cout << "You selected: /" << endl;
        break;
    default:
        cout << "Invalid input: " << buffer << endl;
        return 0;
    }

    for (int i = 0; buffer[i] != '\0'; i++)
        buffer[i] = '\0';
    cout << "Input integer number (a): ";
    cin >> buffer;
    zero_start = true;

    for (int i = 0; buffer[i] != '\0'; i++)
    {
        if (!isdigit(buffer[i]))
        {
            if (i == 0 && buffer[i] == '-')
            {
                a_sign = -1;
                continue;
            }
            else
            {
                cout << "Invalid input: " << buffer << endl;
                return 0;
            }
        }

        if (buffer[i] == '0' && zero_start)
            continue;
        else
        {
            a.push_back((int)(buffer[i] - '0'));
            zero_start = false;
        }
    }
    if (a.empty())
    {
        a.push_back(0);
        a_sign = 0;
    }
    reverse(a.begin(), a.end());

    for (int i = 0; buffer[i] != '\0'; i++)
        buffer[i] = '\0';
    cout << "Input integer number (b): ";
    cin >> buffer;
    zero_start = true;
    for (int i = 0; buffer[i] != '\0'; i++)
    {
        if (!isdigit(buffer[i]))
        {
            if (i == 0 && buffer[i] == '-')
            {
                b_sign = -1;
                continue;
            }
            else
            {
                cout << "Invalid input: " << buffer << endl;
                return 0;
            }
        }

        if (buffer[i] == '0' && zero_start)
            continue;
        else
        {
            b.push_back((int)(buffer[i] - '0'));
            zero_start = false;
        }
    }
    if (b.empty())
    {
        if (n == 5)
        {
            cout << "Invalid input: " << buffer << endl;
            return 0;
        }
        b.push_back(0);
        b_sign = 0;
    }
    reverse(b.begin(), b.end());

    cout << "(a) = " << (a_sign == -1 ? "-" : "");
    for (int i = a.size() - 1; i >= 0; i--)
        cout << a[i];
    cout << '\n'
         << "(b) = " << (b_sign == -1 ? "-" : "");
    for (int i = b.size() - 1; i >= 0; i--)
        cout << b[i];
    cout << endl;
    // write to log file
    log_file << "(a) = " << (a_sign == -1 ? "-" : "");
    for (int i = a.size() - 1; i >= 0; i--)
        log_file << a[i];
    log_file << '\n'
             << "(b) = " << (b_sign == -1 ? "-" : "");
    for (int i = b.size() - 1; i >= 0; i--)
        log_file << b[i];
    log_file << endl;
    // Initialization Done

    int carry = 0;
    if (n == 1)
    {
        log_file.close();
        return 0; // "Display only"
    }
    // "Display only" Done

    else if (n == 2) // "+"
    {
        for (int i = 0; i < a.size() && i < b.size(); i++)
        {
            c.push_back((a[i] * a_sign + b[i] * b_sign + carry) % 10);
            carry = (a[i] * a_sign + b[i] * b_sign + carry) / 10;
        }
        if (a.size() > b.size())
        {
            for (int i = b.size(); i < a.size(); i++)
            {
                c.push_back((a[i] * a_sign + carry) % 10);
                carry = (a[i] * a_sign + carry) / 10;
            }
        }
        else
        {
            for (int i = a.size(); i < b.size(); i++)
            {
                c.push_back((b[i] * b_sign + carry) % 10);
                carry = (b[i] * b_sign + carry) / 10;
            }
        }
        c.push_back(carry);

        zero_start = true;
        for (int i = c.size() - 1; i >= 0; i--)
        {
            if (c[i] == 0 && zero_start)
                c.pop_back();
            else
                break;
        }
        if (c.empty())
            c.push_back(0);

        c_sign = (c[c.size() - 1] < 0 ? -1 : 1);

        for (int i = 0; i < c.size(); i++)
        {
            if (c_sign * c[i] < 0)
            {
                c[i] += (10 * c_sign);
                if (i + 1 < c.size())
                    c[i + 1] += (-1 * c_sign);
                else
                    c.push_back(-1 * c_sign);
            }
            c[i] *= c_sign;
        }

        cout << "(a) + (b) = " << (c_sign < 0 ? "-" : "");
        for (int i = c.size() - 1; i >= 0; i--)
            cout << c[i];
        cout << endl;
        // write to log file
        log_file << "(a) + (b) = " << (c_sign < 0 ? "-" : "");
        for (int i = c.size() - 1; i >= 0; i--)
            log_file << c[i];
        log_file << endl;
        log_file.close();
        return 0;
    }
    // "+" Done

    else if (n == 3) // "-"
    {
        for (int i = 0; i < a.size() && i < b.size(); i++)
        {
            c.push_back((a[i] * a_sign - b[i] * b_sign + carry) % 10);
            carry = (a[i] * a_sign - b[i] * b_sign + carry) / 10;
        }
        if (a.size() > b.size())
        {
            for (int i = b.size(); i < a.size(); i++)
            {
                c.push_back((a[i] * a_sign + carry) % 10);
                carry = (a[i] * a_sign + carry) / 10;
            }
        }
        else
        {
            for (int i = a.size(); i < b.size(); i++)
            {
                c.push_back((-b[i] * b_sign + carry) % 10);
                carry = (-b[i] * b_sign + carry) / 10;
            }
        }
        c.push_back(carry);

        zero_start = true;
        for (int i = c.size() - 1; i >= 0; i--)
        {
            if (c[i] == 0 && zero_start)
                c.pop_back();
            else
                break;
        }
        if (c.empty())
            c.push_back(0);

        c_sign = (c[c.size() - 1] < 0 ? -1 : 1);

        for (int i = 0; i < c.size(); i++)
        {
            if (c_sign * c[i] < 0)
            {
                c[i] += (10 * c_sign);
                if (i + 1 < c.size())
                    c[i + 1] += (-1 * c_sign);
                else
                    c.push_back(-1 * c_sign);
            }
            c[i] *= c_sign;
        }

        cout << "(a) - (b) = " << (c_sign < 0 ? "-" : "");
        for (int i = c.size() - 1; i >= 0; i--)
            cout << c[i];
        cout << endl;
        // write to log file
        log_file << "(a) - (b) = " << (c_sign < 0 ? "-" : "");
        for (int i = c.size() - 1; i >= 0; i--)
            log_file << c[i];
        log_file << endl;
        log_file.close();
        return 0;
    }
    // "-" Done

    else if (n == 4) // "*"
    {
        c_sign = a_sign * b_sign;
        for (int i = 0; i < b.size(); i++)
        {
            for (int j = 0; j < a.size(); j++)
            {
                if (i + j >= c.size())
                    c.push_back(a[j] * b[i]);
                else
                    c[i + j] += a[j] * b[i];
            }
        }
        for (int i = 0; i < c.size(); i++)
        {
            carry += c[i];
            c[i] = carry % 10;
            carry /= 10;
        }
        c.push_back(carry);

        zero_start = true;
        for (int i = c.size() - 1; i >= 0; i--)
        {
            if (c[i] == 0 && zero_start)
                c.pop_back();
            else
                break;
        }
        if (c.empty())
            c.push_back(0);

        cout << "(a) * (b) = " << (c_sign < 0 ? "-" : "");
        for (int i = c.size() - 1; i >= 0; i--)
            cout << c[i];
        cout << endl;
        // write to log file
        log_file << "(a) * (b) = " << (c_sign < 0 ? "-" : "");
        for (int i = c.size() - 1; i >= 0; i--)
            log_file << c[i];
        log_file << endl;
        log_file.close();
        return 0;
    }
    // "*" Done

    else if (n == 5) // "/"
    {
        c_sign = a_sign * b_sign;
        c.push_back(0);

        while (a.size() >= b.size())
        {
            for (int i = 0; i < b.size(); i++)
            {
                carry += a[i] - b[i] + 10;
                a[i] = carry % 10;
                carry = carry / 10 - 1;
            }

            for (int i = b.size(); i < a.size(); i++)
            {
                if (carry == 0)
                    break;
                carry += a[i] + 10;
                a[i] = carry % 10;
                carry = carry / 10 - 1;
            }
            a.push_back(carry);

            zero_start = true;
            for (int i = a.size() - 1; i >= 0; i--)
            {
                if (a[i] == 0 && zero_start)
                    a.pop_back();
                else
                    break;
            }
            if (a.empty())
                a.push_back(0);

            if (a[a.size() - 1] >= 0)
                c[0]++;
            else
                break;
        }

        cout << "(a) / (b) = " << (c_sign < 0 ? "-" : "") << c[0] << endl;
        // write to log file
        log_file << "(a) / (b) = " << (c_sign < 0 ? "-" : "") << c[0] << endl;
        log_file.close();
        return 0;
    }
    // "/" Done

    return 0;
}