Advertisement
qberik

Untitled

Oct 31st, 2022
1,122
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3.  
  4. #define MANTISA 30
  5. using namespace std;
  6.  
  7. bool compare( vector<int> &a, vector<int> &b ); // возвращает ture если первое число больше
  8.  
  9. void addition( vector<int> &a, vector<int> &b );
  10.  
  11. int main(){
  12.  
  13.   // целое
  14.   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, 0, 0, 1, 0 };
  15.   bool a_sing = true;
  16.  
  17.   // реальное
  18.   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, 1, 2, 3, 4, 5 };
  19.   bool b_sing = true;
  20.   int b_exp = -1;
  21.  
  22.   // промежуточное число
  23.   vector< int > tmp = {};
  24.  
  25.   // ответ
  26.   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, 0, 0, 0, 0, 0, 0 };
  27.   int e = b_exp;
  28.   bool ans_sing = a_sing == b_sing;
  29.  
  30.   // позиция первоо ненулевого знак числа a
  31.   int first_non_zero_a = 0;
  32.   for(  first_non_zero_a = 0; a[first_non_zero_a] == 0; first_non_zero_a++ );
  33.   // позиция первоо ненулевого знак числа b
  34.   int first_non_zero_b = 0;
  35.   for(  first_non_zero_b = 0; b[first_non_zero_b] == 0; first_non_zero_b++ );
  36.  
  37.   for( int i = 0; i < MANTISA - first_non_zero_b; i++ ){
  38.     // пустое новое число
  39.     tmp.clear();
  40.     for( int j = 0; j < MANTISA; j++ ){
  41.       tmp.push_back(0);
  42.     }
  43.  
  44.     int num = b[ MANTISA - 1 - i ];
  45.  
  46.  
  47.     for( int j = 0; j < num; j++ ){
  48.       addition(tmp, a);
  49.     }
  50.  
  51.     for( int j = 0; j < i; j++ ){
  52.       tmp.push_back(0);
  53.     }
  54.  
  55.  
  56.     addition(ans, tmp);
  57.  
  58.  
  59.   }
  60.  
  61.  
  62.  
  63.   // вначале ответа могут быть незачащие нули
  64.   // их надо убрать
  65.   while (ans[0] == 0) {
  66.       // если у нас осталась лишь одна цифра ноль
  67.       // то её оставляем
  68.       if (ans[0] == 0 && ans.size() == 1) {
  69.           break;
  70.       }
  71.       ans.erase(ans.begin());
  72.   }
  73.  
  74.   e += ans.size();
  75.  
  76.   while (ans[ans.size() - 1] == 0) {
  77.       ans.pop_back();
  78.   }
  79.  
  80.   //if (first_non_zero_a > first_non_zero_b) e += first_non_zero_a - first_non_zero_b;
  81.  
  82.   if (!ans_sing) {
  83.       cout << "-";
  84.   }
  85.   cout << "0.";
  86.   for (int i = 0; i < ans.size() && i < 30; i++) {
  87.       cout << ans[i];
  88.   }
  89.   cout << 'E';
  90.   cout << e << endl;
  91.  
  92.  
  93.   return 0;
  94. }
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102. bool compare( vector<int> &a, vector<int> &b ){ // возвращает ture если первое число больше
  103.   if( a.size() > b.size() ){
  104.     return true;
  105.   } else if( a.size() < b.size() ){
  106.     return false;
  107.   }else{
  108.     for( int i = 0; i < a.size(); i++ ){
  109.       if( b[i] > a[i] ){
  110.         return false;
  111.       }else if( a[i] > b[i] ){
  112.         return true;
  113.       }
  114.     }
  115.   }
  116.   return true;
  117. }
  118.  
  119.  
  120.  
  121. void addition( vector<int> &a, vector<int> &b ){
  122.   // прибавляет к первому числу второе
  123.  
  124.   // Добавление недостающих разрядов
  125.   // если одно из чисел длиннее
  126.   int max_size = max( a.size(), b.size() );
  127.   if( a.size() != max_size ){
  128.     while( a.size() != max_size )
  129.       a.insert(a.begin(),0);
  130.   }
  131.   if( b.size() != max_size ){
  132.     while( b.size() != max_size )
  133.       b.insert(b.begin(),0);
  134.   }
  135.  
  136.  
  137.   bool flag = false; // перенос разряда
  138.   for( int i = 0; i < a.size(); i++ ){
  139.     int I = a.size() - i - 1; // Индекс с конца массива
  140.  
  141.     // Действие над числом
  142.     a[I] += b[I];
  143.  
  144.     // Проверка на то добавили ли мы разряд
  145.     if( flag ){
  146.       a[I]++;
  147.       flag = false;
  148.     }
  149.  
  150.     // Проверка на то, что мы добавили разряд
  151.     if( a[I] >= 10 ){
  152.       flag = true;
  153.       a[I] -= 10;
  154.     }
  155.   }
  156. }
  157.  
  158.  
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement