Как вычесть одинаковые цифры из больших чисел?
Я вычел большие числа, чьи цифры не равны по длине, но я не могу вычесть числа, которые равны по длине. Я принимаю 2 строки в качестве ввода от пользователя, которые являются числами, и я преобразовываю ее в целочисленный массив, используя str[i]-'0'. До сих пор я поменял местами значения меньшей длины - целые числа большей длины. Я должен сделать вычитание для 50-значных чисел. Я могу вычесть строки неравной длины. Но, в случае чисел равной длины, я не могу сделать Я не могу использовать функцию Atoi. То, что я сделал, это преобразовал строку в массив целых чисел, а затем я делаю вычитание с использованием логики вычитания в sub_logic. Вот моя логика для вычитания чисел с одинаковыми цифрами.
1 ответ
Полу-ответ, потому что я не могу придумать вескую причину для отладки алгоритма Аскера, когда жизнеспособен гораздо более простой подход.
Это ваша прекрасная возможность вести себя как ребенок.
- Оставьте цифры как
string
с1. - Сделайте их одинакового размера, добавив нули к кратчайшему.
- Если вычитаемое число (вычитаемое) больше, переверните два числа, чтобы вы всегда вычитали меньшее число из большего. Запишите, что вы изменили порядок операндов.
- Работая справа налево, вычитайте цифры и отслеживайте любые заимствования из больших цифр по мере необходимости.
- Если вы изменили порядок операндов, отметьте результат как отрицательный.
1 Вам не нужно разбирать символы на числа, потому что никакая нормальная кодировка символов не зашифровывает порядок или расположение чисел. Стандарт C++ [lex.charset] требует этого.
Однако отслеживание заимствований может вынудить вас использовать более широкое хранилище, так как вы можете оказаться с числом до 18, которое стандарт C++ не гарантирует, что символ может хранить. Превышение того, что вы можете сохранить в цифре, и подсчет другого символа, который будет там, не сработает, если числа находятся в конце кодировки. Это не проблема с каждой кодировкой символов, о которой я знаю, но не гарантируется.
Скорее всего, вы можете (предполагая ASCII здесь) сойти с рук
if (a[index] < b[index])
{
a[index - 1]--; // a > b as per step 3 above, so this can't happen with last digit.
a[index] += 10;
}
result[index] = '0' + a[index] - b[index];
для шага 4. Я считаю, что это хорошее предположение для школьного задания, но я был бы более осторожен с производственным кодом, чтобы убедиться, a[index] += 10;
не переполнит char
Заимствованные числа окажутся в верхней части ';' через "а", и никто не будет заботиться с точки зрения математики. Это разрушительно, хотя. a
поврежден в результате