Okorosso

Сумма деление (длинное на короткое) умножение длинная арифметика

Apr 14th, 2021 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <fstream>
  2. #include <algorithm>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <string>
  6. #include <vector>
  7.  
  8. typedef std::vector<int> lnum;
  9. const int base = 1000 * 1000 * 1000; // какой максимальный инт мы храним в каждом блоке вектора
  10.  
  11. void print(lnum a) {
  12.     bool flag = false;
  13.     FILE *fout = fopen("output.txt", "a");
  14.     for (int i = a.size() - 1; i >= 0; i--)
  15.         if ((a[i] != 0) || (a[i] == 0 && flag == 1)) {
  16.             if (flag == 0) {
  17.                 flag = true;
  18.                 fprintf(fout, "%d", a[i]);
  19.             } else
  20.                 fprintf(fout, "%09d", a[i]);
  21.         }
  22.  
  23. }
  24.  
  25. lnum toVec(std::string &str) { // перевд введеного числа из строки в векторный формат
  26.     lnum toReturn;
  27.     for (int i = (int) str.length(); i > 0; i -= 9)
  28.         if (i < 9)
  29.             toReturn.push_back(atoi(str.substr(0, i).c_str()));
  30.         else
  31.             toReturn.push_back(atoi(str.substr(i - 9, 9).c_str()));
  32.     return toReturn;
  33. }
  34.  
  35. lnum sum(lnum a, lnum b) { // функция для суммирования
  36.     int carry = 0;
  37.     for (size_t i = 0; i < std::max(a.size(), b.size()) || carry; ++i) {
  38.         if (i == a.size())
  39.             a.push_back(0);
  40.         a[i] += carry + (i < b.size() ? b[i] : 0);
  41.         carry = a[i] >= base;
  42.         if (carry) a[i] -= base;
  43.     }
  44.     return a;
  45. }
  46.  
  47. void del(lnum a, long long b) { // функция для деления длинного на короткое
  48.     std::vector<lnum> toReturn;
  49.     long long r = 0;
  50.     for (int i = (int) a.size() - 1; i >= 0; --i) {
  51.         r = r * base + a[i];
  52.         a[i] = r / b;
  53.         r %= b;
  54.     }
  55.  
  56.     print(a);
  57.     FILE *fout = fopen("output.txt", "a");
  58.     fprintf(fout, "\n");
  59.     fprintf(fout, "%lld\n", r);
  60. }
  61.  
  62. void multiply(lnum a, lnum b) { // функция для умножения длинного на длинное
  63.     lnum c(a.size() + b.size());
  64.     for (size_t i = 0; i < a.size(); ++i)
  65.         for (int j = 0, carry = 0; j < (int) b.size() || carry; ++j) {
  66.             long long cur = c[i + j] + a[i] * 1ll * (j < (int) b.size() ? b[j] : 0) + carry;
  67.             c[i + j] = int(cur % base);
  68.             carry = int(cur / base);
  69.         }
  70.     while (c.size() > 1 && c.back() == 0)
  71.         c.pop_back();
  72.     print(c);
  73. }
  74.  
  75. int main() {
  76.     using namespace std;
  77.     ifstream cin("input.txt");
  78.     ofstream cout("output.txt");
  79.     string first, second;
  80.     lnum firstLnum, secondLnum, delVec;
  81.     long long b;
  82.     cin >> first  >> second >> b;
  83.  
  84.     firstLnum = toVec(first);
  85.     secondLnum = toVec(second);
  86. //    del(firstLnum, b);
  87.     multiply(firstLnum, secondLnum);
  88.  
  89.  
  90.     return 0;
  91. }
  92.  
Add Comment
Please, Sign In to add comment