1

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

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

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

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

没有什么变化。

我的错误在哪里?

4

3 回答 3

4

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

于 2013-01-25T20:41:47.453 回答
2

您可以使用 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 } )
于 2013-01-25T22:12:45.053 回答
2

你的范围是 type IntRange。这是一个正确的:

range = 1G..1000000G
println range.each { it * it }.sum()
于 2013-01-25T20:48:12.157 回答