2011-08-26 70 views
4

这里总的新手问题...今天,虽然试图计算一个整数列表(实际上是BitSet)的总和,我遇到了溢出的情况,并注意到返回类型/ product)是Int。范围/列表中是否有任何方法总结或将所有值乘以Long?在scala中减少整数/整数范围

val x = 1 to Integer.MaxValue 
println(x.sum) //prints -1453759936 

感谢

回答

9

转换的元素龙(或BigInt有应该是走那么远),同时总结:

x.view.map(_.toLong).sum 

你也可以回去折

x.foldLeft(0L)(_ + _) 

(注:你应该总结过范围内,也许它会更好做一点数学,但我明白这不是你所做的事实)

+0

我喜欢第二个。谢谢.. – Ajay

2

这是不是很有效,但最简单的方法:

val x = 1L to Int.MaxValue 
println(x.sum) //prints 2305843008139952128 

如果需要X包含整数的,而不是多头,你可以做

val x = 1 to Int.MaxValue 
println(x.foldLeft(0L)(_+_)) 
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被自动上变频)。当然,连续整数序列的总和有一个很好的离散公式:)

快乐编码。

+1

看看https://我ssues.scala-lang.org/browse/SI-4658为未来的改进。 :-) – soc

+0

@soc非常好,它使它稳定:) – 2011-08-26 17:02:24

1
Range.Long(1, Int.MaxValue, 1).sum