Как вычесть одинаковые цифры из больших чисел?

Я вычел большие числа, чьи цифры не равны по длине, но я не могу вычесть числа, которые равны по длине. Я принимаю 2 строки в качестве ввода от пользователя, которые являются числами, и я преобразовываю ее в целочисленный массив, используя str[i]-'0'. До сих пор я поменял местами значения меньшей длины - целые числа большей длины. Я должен сделать вычитание для 50-значных чисел. Я могу вычесть строки неравной длины. Но, в случае чисел равной длины, я не могу сделать Я не могу использовать функцию Atoi. То, что я сделал, это преобразовал строку в массив целых чисел, а затем я делаю вычитание с использованием логики вычитания в sub_logic. Вот моя логика для вычитания чисел с одинаковыми цифрами.

1 ответ

Решение

Полу-ответ, потому что я не могу придумать вескую причину для отладки алгоритма Аскера, когда жизнеспособен гораздо более простой подход.

Это ваша прекрасная возможность вести себя как ребенок.

  1. Оставьте цифры как stringс1.
  2. Сделайте их одинакового размера, добавив нули к кратчайшему.
  3. Если вычитаемое число (вычитаемое) больше, переверните два числа, чтобы вы всегда вычитали меньшее число из большего. Запишите, что вы изменили порядок операндов.
  4. Работая справа налево, вычитайте цифры и отслеживайте любые заимствования из больших цифр по мере необходимости.
  5. Если вы изменили порядок операндов, отметьте результат как отрицательный.

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 поврежден в результате

Другие вопросы по тегам