Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <iostream>
- #define MANTISA 30
- using namespace std;
- bool compare( vector<int> &a, vector<int> &b ); // возвращает ture если первое число больше
- void addition( vector<int> &a, vector<int> &b );
- int main(){
- // целое
- 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 };
- bool a_sing = true;
- // реальное
- 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 };
- bool b_sing = true;
- int b_exp = -1;
- // промежуточное число
- vector< int > tmp = {};
- // ответ
- 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 };
- int e = b_exp;
- bool ans_sing = a_sing == b_sing;
- // позиция первоо ненулевого знак числа a
- int first_non_zero_a = 0;
- for( first_non_zero_a = 0; a[first_non_zero_a] == 0; first_non_zero_a++ );
- // позиция первоо ненулевого знак числа b
- int first_non_zero_b = 0;
- for( first_non_zero_b = 0; b[first_non_zero_b] == 0; first_non_zero_b++ );
- for( int i = 0; i < MANTISA - first_non_zero_b; i++ ){
- // пустое новое число
- tmp.clear();
- for( int j = 0; j < MANTISA; j++ ){
- tmp.push_back(0);
- }
- int num = b[ MANTISA - 1 - i ];
- for( int j = 0; j < num; j++ ){
- addition(tmp, a);
- }
- for( int j = 0; j < i; j++ ){
- tmp.push_back(0);
- }
- addition(ans, tmp);
- }
- // вначале ответа могут быть незачащие нули
- // их надо убрать
- while (ans[0] == 0) {
- // если у нас осталась лишь одна цифра ноль
- // то её оставляем
- if (ans[0] == 0 && ans.size() == 1) {
- break;
- }
- ans.erase(ans.begin());
- }
- e += ans.size();
- while (ans[ans.size() - 1] == 0) {
- ans.pop_back();
- }
- //if (first_non_zero_a > first_non_zero_b) e += first_non_zero_a - first_non_zero_b;
- if (!ans_sing) {
- cout << "-";
- }
- cout << "0.";
- for (int i = 0; i < ans.size() && i < 30; i++) {
- cout << ans[i];
- }
- cout << 'E';
- cout << e << endl;
- return 0;
- }
- bool compare( vector<int> &a, vector<int> &b ){ // возвращает ture если первое число больше
- if( a.size() > b.size() ){
- return true;
- } else if( a.size() < b.size() ){
- return false;
- }else{
- for( int i = 0; i < a.size(); i++ ){
- if( b[i] > a[i] ){
- return false;
- }else if( a[i] > b[i] ){
- return true;
- }
- }
- }
- return true;
- }
- void addition( vector<int> &a, vector<int> &b ){
- // прибавляет к первому числу второе
- // Добавление недостающих разрядов
- // если одно из чисел длиннее
- int max_size = max( a.size(), b.size() );
- if( a.size() != max_size ){
- while( a.size() != max_size )
- a.insert(a.begin(),0);
- }
- if( b.size() != max_size ){
- while( b.size() != max_size )
- b.insert(b.begin(),0);
- }
- bool flag = false; // перенос разряда
- for( int i = 0; i < a.size(); i++ ){
- int I = a.size() - i - 1; // Индекс с конца массива
- // Действие над числом
- a[I] += b[I];
- // Проверка на то добавили ли мы разряд
- if( flag ){
- a[I]++;
- flag = false;
- }
- // Проверка на то, что мы добавили разряд
- if( a[I] >= 10 ){
- flag = true;
- a[I] -= 10;
- }
- }
- }
Advertisement
Advertisement