【问题标题】:How do you get the sum of two arrays while keeping track of carry (like bigInt in java)?如何在跟踪进位的同时获得两个数组的总和(如 java 中的 bigInt)?
【发布时间】:2019-03-05 08:04:25
【问题描述】:

我仍在学习编程,我正在尝试添加两个数组 A 和 B,同时跟踪进位。数组都是SIZE = 20,看起来像这样:A = {0,0,..,n} 我下面的代码似乎不起作用,我一生都无法找出错误是什么。例如,如果我添加 A ={0,0,0...,1,2,3} 作为一个数组和 B ={0,0,0,...,7,8,9} 作为数组我得到 802 而不是 912.
代码:

    int index = SIZE -1; 
    int[] newBI = new int[SIZE]
    while(index >=0)
    {   
        int carry = 0; 
        int sum = A[index] + B[index] + carry;
        if(sum >=10) {
            carry = sum/10;
            sum = sum %10; 

        }
        newBI[index] = sum; 
        index--; 
    }
    return newBI; 
}

请帮忙!

【问题讨论】:

  • 每次启动 while 循环时,将 carry 初始化为 0,然后将其添加到总和中。然后,您不会对在 if 语句中计算的 carry 执行任何操作。 (您可能想在循环外声明 carry。)
  • 您的任务是否要求您考虑这样一个事实,即数组可能以另一个进位在左侧结束,因此需要比两个原件多一个长度?例如:{9,9,9} + {9,9,9} = {1,9,9,8}
  • 确保您在程序中不是从左到右进行计算,而是从右到左进行计算。
  • @MichaelBerry 他还需要一个else,如果没有carry 将其设置为0
  • 从技术上讲,ifelse 都不需要。如果两者都被排除,整数运算将自行处理。在计算的总和中,carry = sum / 10 始终为左数或零,sum = sum % 10 始终为右数。

标签: java arrays bigint


【解决方案1】:

正如 cmets 中所述,您需要记住 carry 的值,从一位数到下一位数。此外,当没有数字溢出时清除carry 也很重要。最后,如果在循环结束时设置了carry,则总和太大而无法放入数组中。

static int[] sum(int[] A, int[] B)
{
  int index = SIZE -1; 
  int[] newBI = new int[SIZE];
  int carry = 0;
  while(index >=0)
  {   
      int sum = A[index] + B[index] + carry;
      if(sum >= 10) {
          carry = sum/10;
          sum = sum %10; 
      }
      else
      {
        // important to clear the carry
        carry = 0;
      }
      newBI[index] = sum; 
      index--; 
  }
  if(carry == 1)
  {
    throw new ArithmeticException();
  }
  return newBI; 
}

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多