java – 逐位减去两个整数

最近我得到一个编程难题,我不能为我的生活找到一个令人满意的答案:计算由字符串给出的两个任意大的整数的总和,其中第二个整数可以是负数.这是在 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;
}

解决方法

如果符号为负数且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;
}

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...