Advertisement
qberik

Untitled

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