【问题标题】:Performing arithmetic operations on isolated arraylist elements对孤立的数组列表元素执行算术运算
【发布时间】:2012-02-26 11:28:18
【问题描述】:

我正在为我的问题寻找一个明确的解释(不是寻找代码),但如果一些代码有助于解释你自己,那么请做......谢谢 :)

问题:

-使用Java -Main 类向用户询问 2 个整数输入,然后将它们放入 2 个整数类型的数组列表中。每个数字都被分解并存储在自己的索引中,因此可以说是自己的“元素”。

例如,我现在的代码是这样的:

"请输入一个整数:"

688

"请输入另一个整数:"

349


此时,在内部,我已将输入存储为 2 个数组列表,如下所示:

ArrayList1: [6, 8, 8]

ArrayList2: [3, 4, 9]

现在,假设我要执行一些加法,例如 ArrayList1 + ArrayList2。

我可能会继续创建一个临时的“结果”arraylist,然后在我的计算完成后将该答案移至 arraylist1。

但我遇到的问题是想出一种系统清晰的方法来将数组列表添加在一起。请记住,此示例使用表示长度为 3 的整数的数组列表,但这可以是任何值。例如,我可以有一个包含 50 个元素的数组列表,例如 [2, 4, 4, 3, 7, 3, 6, 3,......] 可以表示数以万亿计的巨大数字,等等。

【问题讨论】:

  • 您是否希望将结果放在一个已经存在的数组中(例如 += 对 int 的行为)?

标签: java algorithm math arraylist addition


【解决方案1】:

想想你会如何做小学加法。您可以先将这些数字排列成这样:

    1  3  7
+      4  5
-----------

然后,您将添加最后两位数字以得到

    1  3  7
+      4  5
-----------
          2

进位为 1。然后将接下来的两位数加上进位:

    1  3  7
+      4  5
-----------
       8  2

现在你有进位0,所以你可以添加最后一个数字和缺少的数字来得到

    1  3  7
+      4  5
-----------
    1  8  2

一般模式如下所示:从每个数组的最后一位开始,将最后两个数字相加得到一个和和一个进位。将和的个位写入结果数组,然后将进位传播到下一列。然后将该列中的值(加上进位)加在一起,并在数字上重复此过程。一旦你用尽了其中一个数字中的所有数字,继续求和,但假装有一个 0 作为缺失的数字。处理完所有数字后,您将获得所需的答案。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果您向后存储数字,您的数组将更容易操作,因为它们的个数、十位、百位等将相互对齐(即它们将位于同一索引处)。

    然后你可以用他们在小学教的方法来实现加法:一个一个地检查数字数组,添加它们,检查数字溢出(>=10),并注意进位标志(结果数字是(a+b) % 10,进位标志是(a+b)/10)。如果完成加法后进位标志不为零,并且两边都没有其他数字,则将进位标志添加到结果数组的末尾。

    剩下的唯一问题是显示列表。你可以通过一个简单的反向循环来做到这一点。

    附:如果您想根据已知可行的方法仔细检查您的 mulch-trilion 计算,请使用 BigInteger 计算预期结果,并根据他们的结果检查您的结果。

    【讨论】:

    • @JohnSmith reverse 实际上反转了列表——这比简单地向后迭代列表要昂贵得多。如果您希望打印中间结果,同时保持数据完整以继续计算,这一点很重要。
    • @JohnSmith 你可以像在纸上一样做乘法。首先,实现一个数组乘以一个数字——这是通过新数组的长度传播一个进位标志的问题,它可以高达 8 个。然后你实现一个数字的移位,这就像在列表末尾添加一个额外的零一样简单。最后,使用您已经编写的加法例程。
    【解决方案3】:

    将数组列表视为存储容器。它可以容纳“整数”类型的项目,但它的类型仍然是“存储容器”。您不能对这些类型的对象进行数学运算,只能对它们的内容进行数学运算。

    【讨论】:

      【解决方案4】:

      你有

      list1
      list2
      

      需要一个额外的变量

      int carry
      

      然后

      1 do add(0,0) on short list, so that at the end two lists have same length.
      
      2 reversely loop the two list. 
        sum=(carry+(e1+e2))
        set e1 (list1 element) = sum%10, 
        carry = sum/10, 
        till the first element.
      3 if carry==1, list1.add(0,1)
      
      now list1 stores the result.
      

      注意,step1 不是必须的。它可以通过检查短列表的长度来循环完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2015-06-02
        • 2015-10-21
        相关资源
        最近更新 更多