BigInteger in Groovy



我想把从 1 到 1000000 的所有数字相加。

range = 1..1000000
println range.each { it * it }.sum()

结果我得到了1784293664而不是500000500000。我假设,我需要一个BigInteger。但是当我尝试时

range = 1..1000000
println range.each { it * it }.sum().toBigInteger()

什么都没有改变。

我的错误在哪里?

您已经完成了具有相同(截断)错误的求和,然后将该错误答案转换为BigInteger。在转换之前是错误的。是什么让你认为BigInteger能够神奇地恢复失去的精度?:-)

您的范围为 IntRange 类型。这是一个正确的:

range = 1G..1000000G
println range.each { it * it }.sum()

您可以使用 G 后缀创建 BigInteger 文字:例如 1G..1000000G . 不需要each表达式。

(1G..1000000G).sum()

你想把这些数字的平方相加吗? 如果是这样,您应该调用collect而不是each。 当你用 each 遍历范围时,你正在计算的表达式 (it * it ) 将被丢弃。 在这种情况下,它看起来像:

(1G..1000000G).collect { it * it }.sum()

请注意,collect强制急切地计算范围,并在内存中创建大型集合。 您可能需要考虑使用 inject 以增量方式计算它:

(1G..1000000G).inject(0, { sum, value -> sum + value * value } )

相关内容

  • 没有找到相关文章

最新更新