Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void divive(BigInt first, BigInt second) {
- // порядок ответа
- int e = 0;
- // мантиса ответа
- vector< int > ans = { 0 };
- bool a_sing = first.isSign();
- bool b_sing = second.isSign();
- // знак ответа
- bool ans_sing = a_sing == b_sing;
- vector<int> a = first.getNumber();
- vector<int> b = second.getNumber();
- // мантиса+'E'+порядок = число
- while (a.size() < MAX_MANTISA_SIZE) {
- a.insert(a.begin(), 0);
- }
- while ( a.size() > MAX_MANTISA_SIZE ) {
- a.pop_back();
- e++;
- }
- while (b.size() < MAX_MANTISA_SIZE) {
- b.insert(b.begin(), 0);
- }
- while ( b.size() > MAX_MANTISA_SIZE ) {
- b.pop_back();
- e--;
- }
- for (int i = 0; i < MAX_MANTISA_SIZE; i++) {
- a.push_back(0);
- b.push_back(0);
- }
- // первый ненулевой знак числа 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
- //cout << "first_non_zero_a " << first_non_zero_a << endl;
- //cout << "first_non_zero_b " << first_non_zero_b << endl;
- 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();
- }
- e -= MAX_MANTISA_SIZE;
- for (int i = 0; i < ans.size() && i < 30; i++) {
- cout << ans[i];
- }
- cout << 'E';
- cout << e << endl;
- // вначале ответа могут быть незачащие нули
- // их надо убрать
- 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();
- }
- e += first_non_zero_a - first_non_zero_b;
- cout << "0.";
- for (int i = 0; i < ans.size() && i < 30; i++) {
- cout << ans[i];
- }
- cout << 'E';
- cout << e << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment