Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<string>
- #include<vector>
- #include<algorithm>
- using namespace std;
- bool NEG = false;
- vector<int> multy(vector<int>U, vector<int> V) {
- vector<int> W(U.size() + V.size() + 1);
- if (V.size() > U.size() || (V.size() == U.size() && V > U))
- swap(U, V);
- int m = V.size();
- U.push_back(0);
- int t;
- int i = 0, k = 0;
- for (int j = 0; j < m; j++)
- {
- for (int i = 0; i < U.size(); i++)
- {
- t = U[i] * V[j] + W[i + j] + k;
- W[i + j] = t % 10;
- k = t / 10;
- }
- }
- if (W.size() > 1) {
- int e = W.size() - 1;
- while (W[e] == 0 && W.size() > 1)
- {
- W.pop_back();
- e--;
- }
- }
- return W;
- }
- vector<int> diff(vector<int> U, vector<int> V) {
- int m = max(U.size(), V.size());
- if (U.size() > 1) {
- int e = U.size() - 1;
- while (U[e] == 0 && U.size() > 1)
- {
- U.pop_back();
- e--;
- }
- }
- if (V.size() > 1) {
- int e = V.size() - 1;
- while (V[e] == 0 && V.size() > 1)
- {
- V.pop_back();
- e--;
- }
- }
- reverse(U.begin(), U.end());
- reverse(V.begin(), V.end());
- if (V.size() > U.size() || (V.size() == U.size() && V > U))
- {
- swap(U, V);
- NEG = true;
- }
- reverse(U.begin(), U.end());
- reverse(V.begin(), V.end());
- if (V.size() < U.size())
- {
- int r = U.size() - V.size();
- for (int i = r; i > 0; i--)
- V.push_back(0);
- }
- vector<int> W;
- int k = 0;
- for (int j = 0; j < U.size(); j++)
- {
- W.push_back((U[j] - V[j] + k + 10) % 10);
- k = (U[j] - V[j] + k - 9) / 10;
- }
- for (int i = 0; i < m; i++)
- W.push_back(0);
- return W;
- }
- vector<int> add(vector<int> U, vector<int>V) {
- int m = max( U.size(), V.size());
- if (U.size() > 1) {
- int e = U.size() - 1;
- while (U[e] == 0 && U.size() > 1)
- {
- U.pop_back();
- e--;
- }
- }
- if (V.size() > 1) {
- int e = V.size() - 1;
- while (V[e] == 0 && V.size() > 1)
- {
- V.pop_back();
- e--;
- }
- }
- if (V.size() > U.size())
- swap(U, V);
- vector<int> W;
- int k = 0;
- int r = U.size() - V.size();
- for (int i = r; i > 0; i--)
- V.push_back(0);
- for (int j = 0; j < U.size(); j++)
- {
- W.push_back((U[j] + V[j] + k) % 10);
- k = (U[j] + V[j] + k) / 10;
- }
- for (int i = 0; i < m; i++)
- W.push_back(0);
- return W;
- }
- int main() {
- setlocale(LC_ALL, "Russian");
- string u, v, str;
- cin >> u >> v;
- vector<int> U;
- vector<int> V;
- int r;
- bool fu = false, fv = false;
- for (int i = u.size() - 1; i >= 0; i--)
- if (u[i] > 57 || u[i] < 48)
- {
- cout << "Ошибка ввода. В первом числе содержатся символы, отличные от цифр" << endl;
- fu = true;
- break;
- }
- for (int i = v.size() - 1; i >= 0; i--)
- if (v[i] > 57 || v[i] < 48)
- {
- cout << "Ошибка ввода. Во втором числе содержатся символы, отличные от цифр" << endl;
- fv = true;
- break;
- }
- bool fp = false, fg = false, fp1 = false, fg1 = false;
- int cntv = 0, cntu = 0;
- int p = 0;
- while (u[p] == '0' && p < u.size())
- p++;
- if (p > 1)
- {
- cout << "Ошибка ввода. Больше одного нуля подряд вначале первого числа" << endl;
- fp = true;
- }
- else if (p == 1 && u.size() > 1)
- {
- cout << "Ошибка ввода. Ноль перед другими цифрами в первом числе с двумя знаками и более" << endl;
- fp1 = true;
- }
- int g = 0;
- while (v[g] == '0' && g < v.size())
- g++;
- if (g > 1)
- {
- cout << "Ошибка ввода. Больше одного нуля подряд вначале второго числа" << endl;
- fg = true;
- }
- else if (g == 1 && v.size() > 1)
- {
- cout << "Ошибка ввода. Ноль перед другими цифрами во втором числе с двумя знаками и более" << endl;
- fp1 = true;
- }
- bool dz = false;
- if (v[0] == '0' && v.size() == 1)
- {
- cout << "Ошибка. Деление на ноль" << endl;
- dz = true;
- }
- bool zer = false;
- if (u[0] == '0' && u.size() == 1 && !dz)
- {
- cout << "0" << endl << "0" << endl;
- zer = true;
- }
- bool men = false;
- if (u.size() < v.size() || (v.size() == u.size() && v > u))
- {
- cout << "0" << endl << u << endl;
- men = true;
- }
- vector<int> W(u.size() + 1);
- if (!fv && !fu && !fg && !fp && !fg1 && !fp1 && !dz && !zer && !men)
- {
- if (v.size() > u.size() || (v.size() == u.size() && v > u))
- swap(u, v);
- int m = v.size();
- for (int i = u.size() - 1; i >= 0; i--)
- {
- U.push_back(atoi(u.substr(i, 1).c_str()));
- }
- for (int i = v.size() - 1; i >= 0; i--)
- V.push_back(atoi(v.substr(i, 1).c_str()));
- int cur, ost = 0;
- vector<int> Chastnoe(u.size());
- if (v.size() == 1) {
- for (int j = U.size() - 1; j >= 0; j--)
- {
- cur = 10 * ost + U[j];
- W[j] = cur / V[0];
- ost = cur % V[0];
- }
- if (W.size() > 1) {
- int e = W.size() - 1;
- while (W[e] == 0 && W.size() > 1)
- {
- W.pop_back();
- e--;
- }
- }
- for (int i = W.size() - 1; i >= 0; i--)
- cout << W[i];
- cout << endl;
- cout << ost;
- cout << endl;
- }
- else {
- int ms = U.size() - V.size();
- int d = 10 / (V[V.size() - 1] + 1);
- vector<int> D;
- D.push_back(d);
- U = multy(U, D);
- V = multy(V, D);
- if (ms + V.size() > U.size() - 1)
- U.push_back(0);
- for (int j = ms; j >= 0; j--)
- {
- int qk = (U[j + V.size()] * 10 + U[j + V.size() - 1]) / V[V.size() - 1];
- int rk = (U[j + V.size()] * 10 + U[j + V.size() - 1]) % V[V.size() - 1];
- step1: if (qk == 10 || qk*V[V.size() - 2] > 10 * rk + U[j + V.size() - 2])
- {
- qk--;
- rk += V[V.size() - 1];
- if (rk < 10)
- goto step1;
- }
- vector<int> QK;
- QK.push_back(qk);
- int s = j + V.size();
- vector<int> chu(V.size() + 1);
- vector<int> raz(V.size() + 1);
- for (int f = s; f >= j; f--)
- chu[f - j] = U[f];
- vector<int> chupa;
- for (int e = 0; e <= V.size(); e++)
- chupa.push_back(0);
- chupa.push_back(1);
- raz = diff(chu, multy(QK, V));
- if (NEG)
- raz = diff(chupa, raz);
- Chastnoe[j] = qk;
- if (NEG)
- {
- Chastnoe[j]--;
- raz = add(V, raz);
- NEG = false;
- }
- for (int f = s; f >= j; f--)
- U[f] = raz[f - j];
- }
- if (Chastnoe.size() > 1) {
- int e = Chastnoe.size() - 1;
- while (Chastnoe[e] == 0 && Chastnoe.size() > 1)
- {
- Chastnoe.pop_back();
- e--;
- }
- }
- for (int i = Chastnoe.size() - 1; i >= 0; i--)
- cout << Chastnoe[i];
- cout << endl;
- vector<int>U2;
- for (int g = V.size() - 1; g >= 0; g--)
- U2.push_back(U[g]);
- reverse(U2.begin(), U2.end());
- vector<int> W2(U2.size());
- for (int z = U2.size() - 1; z >= 0; z--)
- {
- cur = 10 * ost + U2[z];
- W2[z] = cur / D[0];
- ost = cur % D[0];
- }
- if (W2.size() > 1) {
- int e = W2.size() - 1;
- while (W2[e] == 0 && W2.size() > 1)
- {
- W2.pop_back();
- e--;
- }
- }
- for (int i = W2.size() - 1; i >= 0; i--)
- cout << W2[i];
- cout << endl;
- }
- }
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement