Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  sad
Language: C/C++
Code:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
class bigNumber {
private:
    string x;
    string y;
    const int base;
    const int len;
public:
    // Конструктор
    bigNumber (string dig1, string dig2) :
        x (dig1), y (dig2),
        base(1000000000), len(9) {}
    vector<unsigned> BigX;
    vector<unsigned> BigY;
    vector<unsigned> Res;
    // Прототип метода суммирования
    void Sum(vector<unsigned>&,
             vector<unsigned>&,
             vector<unsigned>&);
    // Прототип метода операции сложения
    string Add(void);
    // Прототип метода преобразования Str => Big
    void Input(string&, vector<unsigned>&);
    void IniBig();
    // Прототип метода преобразования Big => Str
    string BigToStr();
};
 
int main() {
    string X, Y;
    cout << "X = ";
    getline(cin, X);
    cout << "Y = ";
    getline(cin, Y);
    bigNumber Num(X, Y);
    cout << "X + Y = " << Num.Add() << endl;
    return 0;
}
 
//=======================================================
// Сумма двух больших целых чисел
//=======================================================
void bigNumber::Sum(vector<unsigned> &V1,
                    vector<unsigned> &V2,
                    vector<unsigned> &Vbig) {
    size_t carry = 0;
    // Смотрим какое длиннее
    size_t q = V1.size() > V2.size() ?
           V1.size() : V2.size();
    Vbig.reserve(q);
    for (size_t i = 0; i < q; i++) {
        Vbig.push_back(V1[i] + V2[i] + carry);
        carry = Vbig[i] / base;
        Vbig[i] = Vbig[i] % base;
    }
    if (carry > 0) {
        q++;
        Vbig.push_back(carry);
    }
}
//====================================================
// Ввод длинного числа str => mas_unsigned
//====================================================
void bigNumber::Input(string &S, vector<unsigned> &V) {
    for (int i = S.size(); i > 0; i -= len)
        // Записываем в вектор перевернутым
        if (i < len)
            V.push_back(stoul(S.substr(0, i)));
        else
            V.push_back(stoul(S.substr(i - len, len)));
}
void bigNumber::IniBig() {
    // Очищаем, если они были заняты
    if (!BigX.empty()) BigX.clear();
    if (!BigY.empty()) BigY.clear();
    // Заполняем
    Input(x, BigX);
    Input(y, BigY);
    // Запрос на оптимизацию
    BigX.shrink_to_fit();
    BigY.shrink_to_fit();
}
//====================================================
// Преобразование длинного числа в строку
//====================================================
string bigNumber::BigToStr() {
    string temp;
    int n = Res.size() - 1;
    for (int i = n; i >= 0; i--) {
        size_t e = 0;
        string r = to_string(Res[i]);
        if (r.size() < size_t(len) && i < n)
            while (e < size_t(len) - r.size()) {
                e++;
                temp += "0";
            }
        temp.append(r);
    }
    return temp;
}
//===========================================================
// Из того, что сделали, собираем нашу операцию
//===========================================================
string bigNumber::Add() {
    IniBig();
    if (!Res.empty()) Res.clear();
    Sum(BigX, BigY, Res);
    Res.shrink_to_fit();
    return BigToStr();
}
          
Comments: