Dan*_*bbs 11 java algorithm integer subtraction
我最近得到了一个编程难题,我不能为我的生活找到一个满意的答案:计算由字符串给出的两个任意大整数的总和,其中第二个整数可能是负的.这是在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;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
如果符号为负数且number2大于number1,则可以简单地交换这些整数数组.
你可以尝试这样的事情:
boolean swap = false;
for(int j = 0; j < number1.length && negative; j++){
if(number2[j] > number1[j]){
swap = true;
int temp[] = number1;
number1 = number2;
number2 = temp;
break;
} else if(number1[j] > number2[j]){
break;
}
}
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 = "";
for(int j = 0; j <result.length; j++){
resultString += (result[j] + "");
}
// Apply carry.
if(carry == 1) {
return "1" + resultString;
} else if(carry == -1 || swap) {//if swap is set sign is -
return "-" + resultString;
} else {
return resultString;
}
Run Code Online (Sandbox Code Playgroud)