qberik

Untitled

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