乘以表示为链表的数字

问题描述

我尝试解决这个问题已经有一段时间了,但到目前为止我的方法都没有奏效。

你得到两个代表大数的链表,其中链表的头部代表最低有效数字。 返回一个存储两个列表相乘结果的新列表。

我尝试了一种算法,该算法适用于第一个列表是单个数字,但仅此而已。

  1. 初始化一个新列表。
  2. 初始化进位。
  3. 虽然节点 1 不为空:
  4. 虽然节点 2 不为空:
  5. 如果节点 3 的 next 不为 null,则将其值添加到进位;
  6. 将节点 3 的下一个设置为节点 1 * 节点 2 的值 + 进位。
  7. 将节点 2 设置为下一个,将节点 3 设置为下一个。
  8. 在第 4 节设置时结束
  9. 将节点 1 设置为节点 1 的下一个。
  10. 在第 3 部分设置时结束。
  11. 在第 1 部分设置的返回列表。

这显然有问题。我还尝试为第一个循环的每次迭代设置一个“powCounter”,并将该值乘以 10 到 powCounter 的幂。 但这也不起作用。

我真的很感激任何帮助!

解决方法

像在纸上一样做。

想必,在让你写 multiply(a,b) 之前,他们早就让你写了 add(a,b),对吧?所以使用它。

您说您已经编写了乘以一位数的逻辑,所以我们称之为 multiplySingle(a,digit)

您还需要一种辅助方法,例如shiftLeft(a,n),将 n 0 添加到数字的末尾,即列表的开头。例如。 shiftLeft([4,3,2,1],2) 应该返回 [0,4,1],意思是 1234 * 10² = 123400

因此,在纸面上,您可以像这样将 123 乘以 456

123 * 456
    45600  =  1 * 456 * 100  =  shiftLeft(multiplySingle([6,5,4],1),2)
     9120  =  2 * 456 * 10   =  shiftLeft(multiplySingle([6,2),1)
     1368  =  3 * 456 * 1    =  shiftLeft(multiplySingle([6,3),0)
    =====
    56088  = 45600 + 9120 + 1368  =  add(add([0,6,[0,1,9]),[8,1])

祝你为此编写代码好运。


仅供参考: shiftLeft() 方法的想法基于内置 BigIntegerBigDecimal 类中的类似方法。

  • BigInteger shiftLeft(int n)

    返回值为 BigInteger(this << n)。移位距离 n 可能为负,在这种情况下,此方法执行右移。 (计算 floor(this * 2ⁿ)。)

  • BigDecimal movePointRight(int n)

    返回一个 BigDecimal,它与小数点向右移动 n 位等价。如果 n 为非负数,则调用仅从比例中减去 n。如果 n 为负数,则调用等效于 movePointLeft(-n)。此调用返回的 BigDecimal 具有值 (this × 10ⁿ) 和缩放 max(this.scale()-n,0)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...