我最近被给了一个编程难题,我不能为我的生活找到一个满意的答案:计算由字符串给出的两个任意大整数的总和,其中第二个整数可能为负数。这将在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;
}
你能举一个例子输入和一个错误的输出例子吗? –
当然。当number1是'1'而number2是'-10'时,我当前的算法给出了-91'。 – DanielGibbs
在纸上试一下简单的例子:11-3。我们会这样做:3 + 8 =(1)1,所以写8,保留一个。然后进行+ 1 = 1,无事可做。你的算法正在做非常不同的事情。 – PMF