如何解决乘以表示为链表的数字
我尝试解决这个问题已经有一段时间了,但到目前为止我的方法都没有奏效。
你得到两个代表大数的链表,其中链表的头部代表最低有效数字。 返回一个存储两个列表相乘结果的新列表。
我尝试了一种算法,该算法适用于第一个列表是单个数字,但仅此而已。
- 初始化一个新列表。
- 初始化进位。
- 虽然节点 1 不为空:
- 虽然节点 2 不为空:
- 如果节点 3 的 next 不为 null,则将其值添加到进位;
- 将节点 3 的下一个设置为节点 1 * 节点 2 的值 + 进位。
- 将节点 2 设置为下一个,将节点 3 设置为下一个。
- 在第 4 节设置时结束
- 将节点 1 设置为节点 1 的下一个。
- 在第 3 部分设置时结束。
- 在第 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()
方法的想法基于内置 BigInteger
和 BigDecimal
类中的类似方法。
-
返回值为
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)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。