我最近被給了一個編程難題,我不能爲我的生活找到一個滿意的答案:計算由字符串給出的兩個任意大整數的總和,其中第二個整數可能爲負數。這將在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