Skip to content

Commit

Permalink
div_chunk(): Синхронизировал библиотеку и тутор
Browse files Browse the repository at this point in the history
  • Loading branch information
1vanK committed Apr 15, 2024
1 parent 7369836 commit c9bf455
Show file tree
Hide file tree
Showing 5 changed files with 19 additions and 14 deletions.
8 changes: 4 additions & 4 deletions big_int.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,8 +237,11 @@ static Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denomina
// Когда в знаменателе одна цифра, используется div_by_digit()
assert(denominator.size() >= 2);

// Старшая цифра знаменателя
DDigit denominator_digit_1 = denominator.back();

// Должно быть нормализовано
assert(denominator.back() >= base / 2);
assert(denominator_digit_1 >= base / 2);

// Две старшие цифры куска.
// Если длина куска равна длине знаменателя, то старшая цифра будет 0
Expand All @@ -251,9 +254,6 @@ static Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denomina
? chunk[chunk.size() - 2] // Старшая цифра куска - 0, но его нет в массиве
: chunk[chunk.size() - 3];

// Старшая цифра знаменателя
DDigit denominator_digit_1 = denominator.back();

// Вторая цифра знаменателя
DDigit denominator_digit_2 = denominator[denominator.size() - 2];

Expand Down
6 changes: 3 additions & 3 deletions docs/4_long_div_1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,15 +179,15 @@ vector<Digit> div_by_base(const vector<Digit>& number)
}

// Делит кусок числителя на знаменатель (подбором).
// Числитель и знаменатель таковы, что в результате всегда одна цифра.
// Кусок и знаменатель таковы, что в результате всегда одна цифра.
// Это фрагмент функции div_mod() из 3_brute_force_div_2.cpp
Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denominator)
{
if (first_is_less(chunk, denominator))
return 0;

assert(chunk.size() == denominator.size() // Длина числителя равна длине знаменателя
|| (chunk.size() == denominator.size() + 1 // Или числитель длиннее знаменателя на 1 цифру
assert(chunk.size() == denominator.size() // Длина куска равна длине знаменателя
|| (chunk.size() == denominator.size() + 1 // Или кусок длиннее знаменателя на 1 цифру
&& first_is_less(div_by_base(chunk), denominator))); // И эта цифра не лишняя

Digit left = 0;
Expand Down
2 changes: 1 addition & 1 deletion docs/4_long_div_2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ vector<Digit> div_by_base(const vector<Digit>& number)
}

// Делит кусок числителя на знаменатель (подбором).
// Числитель и знаменатель таковы, что в результате всегда одна цифра.
// Кусок и знаменатель таковы, что в результате всегда одна цифра.
// Функция скопирована из 4_long_div_1.cpp
Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denominator)
{
Expand Down
7 changes: 5 additions & 2 deletions docs/4_long_div_3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ vector<Digit> div_by_base(const vector<Digit>& number)
}

// Делит кусок числителя на знаменатель (подбором).
// Числитель и знаменатель таковы, что в результате всегда одна цифра.
// Кусок и знаменатель таковы, что в результате всегда одна цифра.
// Функция изменена по сравнению с 4_long_div_2.cpp
// (правая граница ближе к искомой цифре)
Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denominator)
Expand All @@ -229,8 +229,11 @@ Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denominator)
if (chunk.size() != denominator.size())
chunk_2_digits = chunk_2_digits * base + chunk[chunk.size() - 2];

// Старшая цифра знаменателя
DDigit denominator_digit_1 = denominator.back();

// Делим две старшие цифры куска на старшую цифру знаменателя
DDigit dd_right = chunk_2_digits / denominator.back();
DDigit dd_right = chunk_2_digits / denominator_digit_1;
//assert(dd_right < base - 1); // Для тестирования

// Ограничиваем right сверху
Expand Down
10 changes: 6 additions & 4 deletions docs/4_long_div_4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ vector<Digit> div_by_base(const vector<Digit>& number)
}

// Делит кусок числителя на знаменатель.
// Числитель и знаменатель таковы, что в результате всегда одна цифра.
// Кусок и знаменатель таковы, что в результате всегда одна цифра.
// К тому же аргументы должны быть нормализованы (старшая цифра знаменателя >= base / 2).
// Функция изменена по сравнению с 4_long_div_3.cpp (перебор вместо двоичного поиска)
Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denominator)
Expand All @@ -223,15 +223,17 @@ Digit div_chunk(const vector<Digit>& chunk, const vector<Digit>& denominator)
|| (chunk.size() == denominator.size() + 1
&& first_is_less(div_by_base(chunk), denominator)));

// Проверяем, что знаменатель нормализован
assert(denominator.back() >= base / 2);
DDigit denominator_digit_1 = denominator.back();

// Должно быть нормализовано
assert(denominator_digit_1 >= base / 2);

DDigit chunk_2_digits = chunk.back();
if (chunk.size() != denominator.size())
chunk_2_digits = chunk_2_digits * base + chunk[chunk.size() - 2];

// Делим две старшие цифры куска на старшую цифру знаменателя
Digit digit = (Digit)min(chunk_2_digits / denominator.back(), DDigit(base - 1));
Digit digit = (Digit)min(chunk_2_digits / denominator_digit_1, DDigit(base - 1));

#ifndef NDEBUG
size_t misses_count = 0; // Число промахов
Expand Down

0 comments on commit c9bf455

Please sign in to comment.