当前位置: 首页 > 知识库问答 >
问题:

逐位减去两个整数

印晋
2023-03-14

最近我遇到了一个编程难题,我一生都找不到一个满意的答案:计算字符串给出的两个任意大整数之和,其中第二个整数可能是负数。这是在Java中完成的,没有使用任何BigInteger、BigNumber等类。

我最初使用伪代码的方法如下:

  1. 如果第二个字符串的第一个字符是'-',则设置减法标志。
  2. 将每个字符串转换为一个整数数组,每个数字一个。
  3. 用零扩展最短数组和左键,以便两个数组大小相同。
  4. 循环遍历数组的每个索引(从最低有效位到最高有效位)执行加法/减法并使用进位将溢出携带到下一个数字。
  5. 检查进位以添加任何最后一位数字。

我的算法对正数很好,但对负数给出了非常错误的结果。我试图在纸上解决这个问题,但我似乎无法理解如何逐位进行减法。

我目前对步骤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;
}

共有3个答案

墨星鹏
2023-03-14

您可以将其包装为:

if(A>=B):
    calculate A-B
else:
    calculate -(B-A)
南门飞
2023-03-14

如果最后一个进位是-1,那么这意味着您必须将-1*10^(位数)添加到答案中。

 01
-10
---
 91

和进位=-1。因此,必须将-100与91相加才能得到实际答案。

解决方案是简单地从较大的数字中减去较小的数字,然后相应地添加符号。

姚正真
2023-03-14

如果符号是负数,并且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;
}
 类似资料:
  • 问题内容: 在Python中,如何减去两个非唯一的无序列表?假设我们有和我想这样做,并有成为或顺序无关紧要给我。如果a在b中不包含所有元素,则应该抛出异常。 请注意,这与套装不同! 我对找到a和b中的元素集的差异不感兴趣,而对a和b中元素的实际集合之间的差异感兴趣。 我可以使用for循环来执行此操作,在a中查找b的第一个元素,然后从b和a中删除该元素,依此类推。但这对我没有吸引力,这会非常低效(按

  • 问题内容: 我需要能够对两个带注释的列进行汇总 所以我想做这样的事情: 接着: 有谁知道如何完成上述工作? 问题答案: 其实, 从Django 1.8开始 就可以正常工作了。 此外,您还可以按表达式排序,这意味着您可以使用: 甚至只是:

  • 本文向大家介绍程序在8051微处理器中减去两个8位数字,包括了程序在8051微处理器中减去两个8位数字的使用技巧和注意事项,需要的朋友参考一下 现在,在本节中,我们将看到如何使用8051微控制器减去两个8位数字。寄存器A(累加器)在操作中用作一个操作数。在不同的寄存器组中有七个寄存器R0 – R7。我们可以将它们中的任何一个用作第二操作数。 我们在位置20H和21H取两个数字73H和BDH,相减后

  • key2值2 ... 文件2: 我让映射写键,值用一个字符预先说明它来自file1或file2,但不确定如何编写reduce阶段 我的map方法是

  • 问题内容: 我对angularjs相当陌生,但现在就开始了。我可以通过angularjs窗体中的两个日期,但是我需要做的是以某种方式减去两个日期以得到两者之间的天数差异。我创建了一个jQuery函数来执行此操作,但是我不知道如何将两个日期传递给该函数。所以我想知道是否还有其他方法可以解决此问题? 我正在尝试根据两个日期之间要设置样式的某些天之间的天数来设置触发器系统。例如,如果要在10天内使用 样

  • 问题内容: 我的df如下所示: 我想从每个国家的Val1中减去Val10,所以输出如下: 到目前为止,我已经: runDeltas导致此错误: 解决此问题的正确方法是什么? 问题答案: 给定以下数据框: 它归结为一个简单的广播操作):