Я собираю небольшую библиотеку BigInt на C ++ для использования в моем языке программирования.
Структура выглядит следующим образом:
short digits[ 1000 ];
int len;
У меня есть функция, которая преобразует строкув bigint, разделив его на отдельные символы и поместив их в digits
.
Все цифры в цифрах перевернуты, поэтому число 123 будет выглядеть следующим образом:
digits[0]=3 digits[1]=3 digits[2]=1
Мне уже удалось закодировать функцию добавив , котораяработает отлично.
Работает примерно так:
overflow = 0
for i ++ until length of both numbers exceeded:
add numberA[ i ] to numberB[ i ]
add overflow to the result
set overflow to 0
if the result is bigger than 10:
substract 10 from the result
overflow = 1
put the result into numberReturn[ i ]
(Переполнение - это в данном случае то, что происходит, когда я добавляю 1 к 9: вычленяем 10 из 10, добавляем 1 к переполнению, переполняемдобавляется к следующей цифре)
Итак, подумайте о том, как хранятся два числа, например:
0 | 1 | 2
---------
A 2 - -
B 0 0 1
Вышеприведенное представляет digits
из bigints 2 (A) и 100(В).-
означает неинициализированные цифры, к ним нет доступа.
Таким образом, добавление указанного числа работает нормально: начните с 0, добавьте 2 + 0, перейдите к 1, добавьте 0, перейдите к 2, добавьте 1
Но:
Когда я хочу выполнить умножение с вышеупомянутой структурой, моя программа заканчивает тем, что делает следующее:
Начинается с 0, умножается на 2с 0 (eek), перейдите к 1, ...
Так что очевидно, что для умножения я должен получить такой порядок:
0 | 1 | 2
---------
A - - 2
B 0 0 1
Тогда все будетбыть ясным: начать с 0, умножить 0 на 0, перейти к 1, умножить 0 на 0, перейти к 2, умножить 1 на 2
- Как мне получить
digits
в правильную форму для умножения? - Я не хочу делать перемещение или переворачивание массива - мне нужна производительность!