java - 将表示为链表的数字相乘
问题描述
我一直在尝试解决这个问题一段时间,但到目前为止我的方法都没有奏效。
给你两个代表大数字的链接列表,其中列表的头部代表最低有效数字。返回一个新列表,该列表存储两个列表相乘的结果。
我尝试了一种算法,该算法适用于第一个列表是单个数字,但仅此而已。
- 初始化一个新列表。
- 初始化进位。
- 虽然节点 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 添加到数字的末尾,即添加到列表的开头。egshiftLeft([4,3,2,1], 2)
应该返回[0,0,4,3,2,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,5,4], 2), 1)
1368 = 3 * 456 * 1 = shiftLeft(multiplySingle([6,5,4], 3), 0)
=====
56088 = 45600 + 9120 + 1368 = add(add([0,0,6,5,4], [0,2,1,9]), [8,6,3,1])
祝你好运为此编写代码。
仅供参考:方法的想法shiftLeft()
是基于内置BigInteger
和BigDecimal
类中的类似方法。
-
返回
BigInteger
值为 的(this << n)
。移位距离n
可能是负数,在这种情况下,此方法执行右移。(计算floor(this * 2ⁿ)
。) BigDecimal movePointRight(int n)
返回一个
BigDecimal
与此等效的 a,小数点n
向右移动。如果n
是非负数,则调用只是n
从比例中减去。如果n
为负,则调用等效于movePointLeft(-n)
。此调用返回的BigDecimal
具有 value(this × 10ⁿ)
和 scalemax(this.scale()-n, 0)
。
推荐阅读
- c# - CodeBehind 中 DataGrid 列的元素样式无效
- java - Neo4j 3.5 Java 嵌入式。如何增加堆大小?
- django - Django:模型无法在管理员中正确呈现字段
- javascript - React JS如何用日期和数字转换这个对象数组?
- sql - 如何优化 SQL Server 表上的索引
- storage - 我已经成功在谷歌云平台上设置了示例应用程序。运行测试后,我现在想知道我创建的资产存储在哪里?
- javascript - 如何将我的 popup.js 中的“类”/对象类型导入 chrome 扩展中的 contentScript.js 以便两者都可以访问?
- java - 许多 TIME_WAIT 无法获得 ESTABLISHED tcp 连接
- scala - 如何使用 EitherT 在 for 理解中映射选项
- powershell - ffmpeg:编辑元数据并自动增加其名称+根据“名称”设置“标题”的值