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