Чтобы сравнить длинные числа необходимо и достаточно определить три операции: “больше”, “меньше” и “проверка на равенство”. Отметим важный факт: для реализации задуманного можно реализовать только только одну операцию (или “больше” или “меньше”). Остальные можно выразить из нее.
Но если же требуется реализовать какую-то отдельную операцию в отдельности, то нет необходимости реализовывать все 3 операции.
Ниже представлены все три операции по отдельности:
- bool operator == (const BigInt &a, const BigInt &b)
- {
- if (a.amount!=b.amount)
- return false;
- for (int i=0;i<a.amount;i++)
- {
- if (a.digits[i]!=b.digits[i])
- return false;
- }
- return true;
- }
- bool operator > (const BigInt &a, const BigInt &b)
- {
- if (a.amount!=b.amount)
- return a.amount>b.amount;
- for (int i=a.amount-1;i>=0;i--)
- {
- if (a.digits[i]!=b.digits[i])
- return a.digits[i]>b.digits[i];
- }
- return false;
- }
- bool operator < (const BigInt &a, const BigInt &b)
- {
- if (a.amount!=b.amount)
- return a.amount<b.amount;
- for (int i=a.amount-1;i>=0;i--)
- {
- if (a.digits[i]!=b.digits[i])
- return a.digits[i]<b.digits[i];
- }
- return false;
- }
* This source code was highlighted with Source Code Highlighter.
Вроде бы ошибка в алгоритме определения большего/меньшего. Тут вы идете с конца числа до первого не совпадающего, и возвращаете результат. Соответственно, если будут отличаться старшие разряды, то это не учтется. Надо идти сначала.
ОтветитьУдалить14554
24553
Например, эти числа будут посчитаны неправильно, этот алгоритм будет считать что 14554>24553 ибо 4>3
Число хранится задом наперед. Об этом написано здесь: http://cppalgo.blogspot.com/2010/05/blog-post_28.html
ОтветитьУдалитьВо всем остальном ваша логика верна.
а как выразить остальные операции через одну? например я выразил меньше, тогда остальные определяются как больше(!< && !=) и равно(!< && !>), но это же рекурсия
ОтветитьУдалить1. Пусть реализована операция <. Т.е. вы можете отвечать на вопрос a < b.
Удалить2. Чтобы реализовать операцию >, т.е. ответить на вопрос a > b можно воспользоваться операцией меньше и ответить на вопрос b < a
3. Чтобы реализовать операцию == нужно проверить условие (!< && !>)
4. Чтобы реализовать операцию например >= нужно проверить условие !<.
"но это же рекурсия" - а кто говорил, что будет легко? =)
"а кто говорил, что будет легко?" - да в общем-то меня это не пугает, а вот прога работать отказывается))
УдалитьСпасибо большое, мысль, что можно b<a делать пролетела мимо =)