qberik

Untitled

Oct 17th, 2022
782
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.21 KB | None | 0 0
  1.  
  2. void divive(BigInt first, BigInt second) {
  3.  
  4.  
  5.     // порядок ответа
  6.     int e = 0;
  7.  
  8.     // мантиса ответа
  9.     vector< int > ans = { 0 };
  10.  
  11.     bool a_sing = first.isSign();
  12.     bool b_sing = second.isSign();
  13.     // знак ответа
  14.     bool ans_sing = a_sing == b_sing;
  15.  
  16.     vector<int> a = first.getNumber();
  17.     vector<int> b = second.getNumber();
  18.  
  19.     // мантиса+'E'+порядок = число
  20.  
  21.     while (a.size() < MAX_MANTISA_SIZE) {
  22.         a.insert(a.begin(), 0);
  23.     }
  24.  
  25.     while ( a.size() > MAX_MANTISA_SIZE )  {
  26.       a.pop_back();
  27.       e++;
  28.     }
  29.  
  30.     while (b.size() < MAX_MANTISA_SIZE) {
  31.         b.insert(b.begin(), 0);
  32.     }
  33.  
  34.     while ( b.size() > MAX_MANTISA_SIZE )  {
  35.       b.pop_back();
  36.       e--;
  37.     }
  38.  
  39.     for (int i = 0; i < MAX_MANTISA_SIZE; i++) {
  40.         a.push_back(0);
  41.         b.push_back(0);
  42.     }
  43.  
  44.  
  45.     // первый ненулевой знак числа a
  46.     int first_non_zero_a = 0;
  47.     for (first_non_zero_a = 0; a[first_non_zero_a] == 0; first_non_zero_a++);
  48.     // первый ненулевой знак числа b
  49.     int first_non_zero_b = 0;
  50.     for (first_non_zero_b = 0; b[first_non_zero_b] == 0; first_non_zero_b++);
  51.  
  52.  
  53.     // если первое число больше то двигаем второе число левее
  54.     // чтобы столбиком делить
  55.     if (compare(a, b)) {
  56.         for (int i = 0; i < first_non_zero_b - first_non_zero_a; i++) {
  57.             // двигаем на 1 влево
  58.             b.erase(b.begin());
  59.             b.push_back(0);
  60.         }
  61.     }
  62.  
  63.     // считаем на 30 знаков больше, чтобы точность была больше 30
  64.  
  65.     //cout << "first_non_zero_a " << first_non_zero_a << endl;
  66.     //cout << "first_non_zero_b " << first_non_zero_b << endl;
  67.     for (int i = 0; i < first_non_zero_b - first_non_zero_a + 1 + MAX_MANTISA_SIZE; i++) {
  68.  
  69.         // вычитаем пока можем
  70.         // чтобы получить частное
  71.         int n = 0;
  72.         while (compare(a, b)) { // вычитаем пока первое число больше
  73.             subdivide(a, b);
  74.             n++;
  75.         }
  76.  
  77.         ans.push_back(n);
  78.  
  79.         b.insert(b.begin(), 0); // двигаем челитель на 1 вправо
  80.         b.pop_back();
  81.  
  82.     }
  83.  
  84.  
  85.     e -= MAX_MANTISA_SIZE;
  86.  
  87.  
  88.  
  89.     for (int i = 0; i < ans.size() && i < 30; i++) {
  90.         cout << ans[i];
  91.     }
  92.     cout << 'E';
  93.     cout << e << endl;
  94.  
  95.     // вначале ответа могут быть незачащие нули
  96.     // их надо убрать
  97.     while (ans[0] == 0) {
  98.  
  99.         // если у нас осталась лишь одна цифра ноль
  100.         // то её оставляем
  101.         if (ans[0] == 0 && ans.size() == 1) {
  102.             break;
  103.         }
  104.  
  105.         ans.erase(ans.begin());
  106.     }
  107.  
  108.     e += ans.size();
  109.  
  110.     while (ans[ans.size() - 1] == 0) {
  111.         ans.pop_back();
  112.     }
  113.     e += first_non_zero_a - first_non_zero_b;
  114.  
  115.  
  116.     cout << "0.";
  117.     for (int i = 0; i < ans.size() && i < 30; i++) {
  118.         cout << ans[i];
  119.     }
  120.     cout << 'E';
  121.     cout << e << endl;
  122.  
  123. }
Advertisement
Add Comment
Please, Sign In to add comment