Advertisement
qberik

HW1_TICD.cpp

Oct 17th, 2022
692
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.82 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3. #include "Models/BigInt.h"
  4.  
  5. #define MAX_MANTISA_SIZE 30
  6. using namespace std;
  7. //= type;
  8.  
  9. bool compare(vector<int>& a, vector<int>& b); // возвращает ture если первое число больше
  10.  
  11. void subdivide(vector<int>& a, vector<int>& b); // вычитает из первого числа второе
  12.  
  13. void print(vector<int>& a) { // функция для печати вектора
  14.     for (auto i : a) {
  15.         //cout << i << ' ';
  16.         cout << i;
  17.     } cout << endl;
  18. }
  19.  
  20.  
  21. void divive(BigInt first, BigInt second) {
  22.  
  23.  
  24.     // порядок ответа
  25.     int e = 0;
  26.  
  27.     // мантиса ответа
  28.     vector< int > ans = { 0 };
  29.  
  30.     bool a_sing = first.isSign();
  31.     bool b_sing = second.isSign();
  32.     // знак ответа
  33.     bool ans_sing = a_sing == b_sing;
  34.  
  35.     vector<int> a = first.getNumber();
  36.     vector<int> b = second.getNumber();
  37.  
  38.  
  39.     while (a.size() < MAX_MANTISA_SIZE) {
  40.         a.insert(a.begin(), 0);
  41.     }
  42.  
  43.     while ( a.size() > MAX_MANTISA_SIZE )  {
  44.       a.pop_back();
  45.       e++;
  46.     }
  47.  
  48.     while (b.size() < MAX_MANTISA_SIZE) {
  49.         b.insert(b.begin(), 0);
  50.     }
  51.  
  52.     while ( b.size() > MAX_MANTISA_SIZE )  {
  53.       b.pop_back();
  54.       e--;
  55.     }
  56.  
  57.     for (int i = 0; i < MAX_MANTISA_SIZE; i++) {
  58.         a.push_back(0);
  59.         b.push_back(0);
  60.     }
  61.  
  62.  
  63.     // первый ненулевой знак числа a
  64.     int first_non_zero_a = 0;
  65.     for (first_non_zero_a = 0; a[first_non_zero_a] == 0; first_non_zero_a++);
  66.     // первый ненулевой знак числа b
  67.     int first_non_zero_b = 0;
  68.     for (first_non_zero_b = 0; b[first_non_zero_b] == 0; first_non_zero_b++);
  69.  
  70.  
  71.     // если первое число больше то двигаем второе число левее
  72.     // чтобы столбиком делить
  73.     if (compare(a, b)) {
  74.         for (int i = 0; i < first_non_zero_b - first_non_zero_a; i++) {
  75.             // двигаем на 1 влево
  76.             b.erase(b.begin());
  77.             b.push_back(0);
  78.         }
  79.     }
  80.  
  81.     // считаем на 30 знаков больше, чтобы точность была больше 30
  82.  
  83.     //cout << "first_non_zero_a " << first_non_zero_a << endl;
  84.     //cout << "first_non_zero_b " << first_non_zero_b << endl;
  85.     for (int i = 0; i < first_non_zero_b - first_non_zero_a + 1 + MAX_MANTISA_SIZE; i++) {
  86.  
  87.         // вычитаем пока можем
  88.         // чтобы получить частное
  89.         int n = 0;
  90.         while (compare(a, b)) { // вычитаем пока первое число больше
  91.             subdivide(a, b);
  92.             n++;
  93.         }
  94.  
  95.         ans.push_back(n);
  96.  
  97.         b.insert(b.begin(), 0); // двигаем челитель на 1 вправо
  98.         b.pop_back();
  99.  
  100.     }
  101.  
  102.  
  103.     e -= MAX_MANTISA_SIZE;
  104.  
  105.  
  106.  
  107.     for (int i = 0; i < ans.size() && i < 30; i++) {
  108.         cout << ans[i];
  109.     }
  110.     cout << 'E';
  111.     cout << e << endl;
  112.  
  113.     // вначале ответа могут быть незачащие нули
  114.     // их надо убрать
  115.     while (ans[0] == 0) {
  116.  
  117.         // если у нас осталась лишь одна цифра ноль
  118.         // то её оставляем
  119.         if (ans[0] == 0 && ans.size() == 1) {
  120.             break;
  121.         }
  122.  
  123.         ans.erase(ans.begin());
  124.     }
  125.  
  126.     e += ans.size();
  127.  
  128.     while (ans[ans.size() - 1] == 0) {
  129.         ans.pop_back();
  130.     }
  131.     e += first_non_zero_a - first_non_zero_b;
  132.  
  133.  
  134.     cout << "0.";
  135.     for (int i = 0; i < ans.size() && i < 30; i++) {
  136.         cout << ans[i];
  137.     }
  138.     cout << 'E';
  139.     cout << e << endl;
  140.  
  141.  
  142. }
  143.  
  144.  
  145. int main() {
  146.  
  147.     setlocale(LC_ALL, "Ru");
  148.  
  149.     BigInt a, b;
  150.     string input1;
  151.     string input2;
  152.     cout << "Введите 1 число (до 30 знаков): ";
  153.     cin >> input1;
  154.     cout << "Введите 2 число (до 30 знаков): ";
  155.     cin >> input2;
  156.     if (input1 == "0") {
  157.         cout << "0.0E0\n";
  158.     }
  159.     else {
  160.         a.inputInt(input1);
  161.         if (input2 == "0") {
  162.             cout << "На 0 делить нельзя!\n";
  163.         }
  164.         else {
  165.             b.inputInt(input2);
  166.             divive(a, b);
  167.         }
  168.     }
  169.  
  170.  
  171.     return 0;
  172. }
  173.  
  174.  
  175. bool compare(vector<int>& a, vector<int>& b) { // возвращает ture если первое число больше
  176.     if (a.size() > b.size()) {
  177.         return true;
  178.     }
  179.     else if (a.size() < b.size()) {
  180.         return false;
  181.     }
  182.     else {
  183.         for (int i = 0; i < a.size(); i++) {
  184.             if (b[i] > a[i]) {
  185.                 return false;
  186.             }
  187.             else if (a[i] > b[i]) {
  188.                 return true;
  189.             }
  190.         }
  191.     }
  192.     // если числа равны возвращаю true
  193.     // проверено, так надо
  194.     // иначе 2 / 1 = 1.999999
  195.     return true;
  196. }
  197.  
  198. void subdivide(vector<int>& a, vector<int>& b) { // вычитает из первого числа второе
  199.     // считается, что первое число в этой функции больше второго
  200.  
  201.     // Добавление недостающих разрядов
  202.     // если одно число длиннее
  203.     int max_size = max(a.size(), b.size());
  204.     if (a.size() != max_size) {
  205.         vector<int> tmp;
  206.         for (int i = 0; i < max_size - a.size(); i++) {
  207.             tmp.push_back(0);
  208.         }
  209.         for (int i = 0; i < a.size(); i++) {
  210.             tmp.push_back(a[i]);
  211.         }
  212.         a = tmp;
  213.     }
  214.     if (b.size() != max_size) {
  215.         vector<int> tmp;
  216.         for (int i = 0; i < max_size - b.size(); i++) {
  217.             tmp.push_back(0);
  218.         }
  219.         for (int i = 0; i < b.size(); i++) {
  220.             tmp.push_back(b[i]);
  221.         }
  222.         b = tmp;
  223.     }
  224.  
  225.     bool add = false;
  226.     bool flag = false; // перенос разряда
  227.     for (int i = 0; i < a.size(); i++) {
  228.         int I = a.size() - i - 1; // Индекс с конца массива
  229.  
  230.         // Действие над числом
  231.         if (add) {
  232.             a[I] += b[I];
  233.         }
  234.         else {
  235.             a[I] -= b[I];
  236.         }
  237.  
  238.         // Проверка на то заняли ли мы разряд
  239.         if (flag) {
  240.             if (add) {
  241.                 a[I]++;
  242.             }
  243.             else {
  244.                 a[I]--;
  245.             }
  246.             flag = false;
  247.         }
  248.  
  249.         // Проверка на то, что мы занимали разряд
  250.         if (add) {
  251.             if (a[I] >= 10) {
  252.                 flag = true;
  253.                 a[I] -= 10;
  254.             }
  255.         }
  256.         else {
  257.             if (a[I] < 0) {
  258.                 flag = true;
  259.                 a[I] += 10;
  260.             }
  261.         }
  262.     }
  263.  
  264. }
  265.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement