Недавно мне была дана программирующая головоломка, на которую я не могу на всю жизнь найти удовлетворительный ответ: вычислите сумму двух произвольно больших целых чисел, заданных строками, где второе целое число может быть отрицательным. Это должно было быть сделано на Java без использования каких-либо классов BigInteger
, BigNumber
и т.д.
В псевдокоде мой первоначальный подход заключался в следующем:
- Если первый символ второй строки равен "-", установите флаг вычитания.
- Преобразование каждой строки в массив целых чисел, по одному для каждой цифры.
- Расширьте кратчайший массив и левый блок с нулями, чтобы оба массива имели одинаковый размер.
- Пронумеруйте каждый индекс массивов (от младшей значащей цифры до самой значащей цифры), выполнив сложение/вычитание и используя перенос для переноса переполнения на следующую цифру.
- Проверьте перенос, чтобы добавить последние цифры.
Мой алгоритм отлично работает для положительных чисел, но дает отрицательные результаты для отрицательных чисел. Я попытался это сделать на бумаге, но я просто не понимаю, как делать вычитание по цифре.
Мой текущий алгоритм для шагов 4 и 5 выглядит следующим образом:
int[] result = new int[number1.length];
int carry = 0;
for(int i = number1.length - 1; i >= 0; i--) {
int newDigit = (negative ? number1[i] - number2[i] : number1[i] + number2[i]);
newDigit += carry;
if (newDigit >= 10) {
carry = 1;
newDigit -= 10;
} else if (newDigit < 0) {
carry = -1;
newDigit += 10;
} else {
carry = 0;
}
result[i] = newDigit;
}
// Convert result back into a string.
String resultString = intArrayToString(result);
// Apply carry.
if(carry == 1) {
return "1" + resultString;
} else if(carry == -1) {
return "-" + resultString;
} else {
return resultString;
}