Рассмотрим случай беззнакового вычитания, когда вычитаемое не превосходит уменьшаемого(A-B, A>=B):
- BigInt operator - (const BigInt &a, const BigInt &b)
- {
- BigInt res = a;
- int r = 0;
- for (int i = 0;i<res.amount;i++)
- {
- res.digits[i] -= b.digits[i] + r;
- if (res.digits[i]<0)
- {
- res.digits[i]+=osn;
- res.digits[i+1]--;
- }
- }
- int pos = res.amount;
- while (pos && !res.digits[pos])
- pos--;
- res.amount = pos+1;
- return res;
- }
* This source code was highlighted with Source Code Highlighter.
В реализации данной операции необходимо корректно учесть случай, когда a=b.
P.S: В первой версии выводились лишние ведущие нули. Эту ошибку обнаружил Privalov, за что выражаю ему благодарность.
ну хочется написать вместо if while потому что очевидно на варианте 1111111111111111-1111111111111110 программа даст не правильную длину... возможно решение не самое оптимальное, но по крайней мере рабочее
ОтветитьУдалитьСпасибо! Это был ценный комментарий!
ОтветитьУдалитьЗаодно выявили слабости тестов проверяющей системы. По этому поводу создал ветку в форуме:
http://informatics.mccme.ru/moodle/mod/forum/discuss.php?d=828
По поводу оптимальности решения я полностью согласен. Практически во всех операциях присутствуют лишние копирования массивов, некоторые операции можно оформить в виде функций и записывать ответ в первый операнд. НО! Все эти оптимизации люди осуществляют с пониманием дела, когда за плечами имеется определенный опыт работ с длинными числами. Моей же задачей было помочь с пониманием на начальном этапе, когда этого опыта практически нет.
я, кажется, обнаружил тут одну лишнею переменную... по-моему r тут лишняя, вам так не кажется?
ОтветитьУдалитьАнатоле одобряет =). Действительно r не нужна. Скорее всего, когда писал, на фоне думал про длинное + длинное.
ОтветитьУдалить