Как правильно заметил @James Kanze, преобразования в и из строки не являются главной проблемой дизайна, и вы должны оставить их до конца. Если вы сосредоточитесь на упрощении интерфейса с внешним миром, у вас может получиться дизайн, который легко сериализовать, но работать с ним - кошмар.
Что касается конкретной проблемы, то общий подход к эффективной работе с bignumbers заключается в использовании половины битов в каждой единице хранения (если ваш unsigned long
равен 32 битам, используйте только младшие 16 бит). Наличие свободного пространства во всех единицах позволяет вам работать отдельно в каждом элементе, не имея дело с переполнением, а затем normalize
результатом, перемещая вынос (старшие битовые числа). Упрощенный подход псевдо-кода для суммирования (игнорирование размеров и, в основном, всего остального будет:
bignumber& bignumber::operator+=( bignumber const & rhs ) {
// ensure that there is enough space
for ( int i = 0; i < size(); ++i ) {
data[ i ] += rhs.data[ i ]; // might break invariant but won't overflow
}
normalize(); // fix the invariant
}
// Common idiom: implement operator+ in terms of operator+= on the first argument
// (copied by value)
bignumber operator+( bignumber lhs, bignumber const & rhs ) {
lhs += rhs;
return lhs;
}