Глядя на конструктор, выясняется, что массив цифр в вашей структуре данных представляет собой последовательность десятичных цифр, закодированных в двоичном виде (значение 0..9) в обратном порядке.
Таким образом, 1992 будет закодирован как 2,9,9,1.
Для того, чтобы сделать цифру пригодной для печати, вам нужно добавить к ней «0».Затем вам нужно выполнить итерацию от конца к началу и объединить версию для печати.Что-то вроде:
string LargeInteger::tostring()
{
string intValue;
for (int i=numDigits-1; i>=0; i--)
intValue += digits[i] + '0';
return intValue;
}
Демонстрация в сети
Предложение 1
Вместо хранения цифр в виде массива целых чисел, вы можете очень хорошо использоватьстрока, так как строка может содержать любые двоичные данные, включая '\ 0'.Это позволит избежать проблем с выделением памяти.
Если вы пойдете по этому пути, вы также можете использовать итераторы и алгоритмы и написать ту же функцию, что и:
string LargeInteger::tostring()
{
string intValue(digits.size(),' ');
transform (digits.rbegin(), digits.rend(), intValue.begin(),
[](auto &x){ return x+'0'; }) ;
return intValue;
}
Демонстрационная версия
Предложение 2
Обратите внимание, что ваш конструктор не работает с отрицательным числом, поскольку отрицательный log10()
вызывает исключение.
Это можно исправить с помощью абсолютного числа:
numDigits = (int)log10(abs((double)value)) + 1;
Однако использование модуля по отрицательному числу дает отрицательную цифру.Это означает, что наш tostring()
необходимо будет изменить, чтобы использовать абсолютное значение каждой цифры, и, если любая цифра является отрицательной, добавьте знак минус в начале числа (см. онлайн-демонстрация здесь ),
Более удобный подход состоял бы в том, чтобы на уровне класса был установлен флаг знака (чтобы сказать, является ли число в целом положительным или отрицательным), и измените конструктор так, чтобы цифры всегда были положительными.