【问题标题】:Performing multiplication on isolated arraylist elements对孤立的数组列表元素执行乘法
【发布时间】:2012-02-04 00:01:19
【问题描述】:

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

问题:

-使用Java

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

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

"请输入一个整数:"

688

"请输入另一个整数:"

34

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

ArrayList1: [6, 8, 8]

ArrayList2: [3, 4]

现在,假设我要执行一些乘法运算,例如 ArrayList1 * ArrayList2。

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

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

【问题讨论】:

  • 如果允许/可用/相关,BigInteger 可能是一种更有效的方法。
  • 很公平。从上下文中不确定这是否是一个练习。
  • 如果你的列表是 [8,8,6] 和 [4,3],你会发现它会容易得多,这样表示的值是元素乘以十的幂的总和index - 否则您必须提前计算结果中的位数,或者如果您需要另一个,则必须移动所有内容。

标签: java algorithm math arraylist multiplication


【解决方案1】:

除非您使用诸如Karatsuba multiplication 之类的快速算法,否则您所描述的将两个数字相乘的算法是您在小学学习的简单 O(n^2) 算法 - 将第二个列表的每个数字乘以每个数字第一个列表的数字,必要时携带。所以,对于你的第一个例子,这个算法给你 688 x 34 = [6*4, 8*4, 8*4] + [6*3, 8*3, 8*3, 0] = [24, 32, 32] + [18, 24, 24, 0],携带后变为 [2, 7, 5, 2] + [2, 0, 6, 4, 0] = [2, 3, 3, 9, 2]。

【讨论】:

    【解决方案2】:

    听起来您最终想要乘以,在您的示例中:688 * 34。要使用您正在使用的结构来执行此操作,ArrayList 将使用 2 个 for 循环完成,每个列表一个(增强 for 循环,因为它是一个可迭代的对象)。从第一个数组中取出每个元素将乘以 10^i 次方,得到 (8 * 10^0) + (8 *10^1) + (6 * 10^2) = 688。每个元素将乘以每个元素第二个列表中的整数并乘以 10^j,就像在第一个循环中所做的那样。在循环中保持每次迭代的运行计数器,以便在每次乘法发生时求和。

    【讨论】:

      【解决方案3】:

      伪代码:

      subtotal=0
      iterate AL1 on index i (where i goes from zero to AL1.length()-1)
      {
        iterate AL2 on index j (where j goes from zero to AL2.length()-1))
        {
          increment subtotal by AL2[AL2.length-j]*10^j * AL1[AL1.length-i]*10^i
          increment j
        }
        increment i
      }
      

      【讨论】:

        猜你喜欢
        • 2012-02-26
        • 2012-05-03
        • 1970-01-01
        • 2015-05-26
        • 2019-07-18
        • 2015-05-13
        • 1970-01-01
        • 1970-01-01
        • 2011-09-16
        相关资源
        最近更新 更多