这里总有新手问题...今天在尝试计算整数列表的总和(实际上是BitSet)时,我遇到了溢出场景并注意到(sum / product)的返回类型是Int。 Range / List中是否有任何方法可以总结或说出将所有值乘以Long?
val x = 1 to Integer.MaxValue
println(x.sum) //prints -1453759936
感谢
答案 0 :(得分:9)
在求和时将元素转换为Long(或BigInt应该走得那么远):
x.view.map(_.toLong).sum
你也可以回去弃牌
x.foldLeft(0L)(_ + _)
(注意:如果你在一个范围内求和,也许最好做一点数学,但我明白这不是你所做的事情)
答案 1 :(得分:2)
这不是很有效,但最简单的方法是:
val x = 1L to Int.MaxValue
println(x.sum) //prints 2305843008139952128
如果你需要x来包含Ints而不是Longs,你可以
val x = 1 to Int.MaxValue
println(x.foldLeft(0L)(_+_))
答案 2 :(得分:2)
比较
>> val x = 1 to Int.MaxValue
x: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(...)
使用:
>> val x = 1L to Int.MaxValue
x: scala.collection.immutable.NumericRange.Inclusive[Long] = NumericRange(...)
请注意,第一个使用Int.to
,后者使用Long.to
(其中Int.MaxValue自动向上转换)。当然,连续整数序列的总和有一个非常好的离散公式:)
快乐的编码。
答案 3 :(得分:1)
Range.Long(1, Int.MaxValue, 1).sum