无法为scala中的while循环中的变量分配一个大数字

时间:2017-07-31 05:40:13

标签: scala while-loop numbers variable-assignment

我想编写一个程序,可以找到第N个数字,只包含因子2,3或5。

def method3(n:Int):Int = {
  var q2 = mutable.Queue[Int](2)
  var q3 = mutable.Queue[Int](3)
  var q5 = mutable.Queue[Int](5)
  var count = 1
  var x:Int = 0
  while(count != n){
    val minVal = Seq(q2,q3,q5).map(_.head).min
    if(minVal == q2.head){
      x = q2.dequeue()
      q2.enqueue(2*x)
      q3.enqueue(3*x)
      q5.enqueue(5*x)
    }else if(minVal == q3.head){
      x = q3.dequeue()
      q3.enqueue(3*x)
      q5.enqueue(5*x)
    }else{
      x = q5.dequeue()
      q5.enqueue(5*x)
    }
    count+=1
  }
  return x
}
println(method3(1000))
println(method3(10000))
println(method3(100000))

结果

51200000
0
0

当输入数字变大时,我从函数中得到0。 但是,如果我将功能更改为

    def method3(n:Int):Int = {
    ...

      q5.enqueue(5*x)
    }
    if(x > 1000000000) println(('-',x)) //note here!!!
    count+=1
  }
  return x
}

结果

51200000
(-,1006632960)
(-,1007769600)
(-,1012500000)
(-,1019215872)
(-,1020366720)
(-,1024000000)
(-,1025156250)
(-,1033121304)
(-,1036800000)
(-,1048576000)
(-,1049760000)
(-,1054687500)
(-,1061683200)
(-,1062882000)
(-,1073741824)
0
.....

所以当输入数字变大时,我不知道为什么结果等于0。

1 个答案:

答案 0 :(得分:2)

Int仅为32位(4字节)。您正在达到Int可以容纳的限制。

获取您遇到的最后一个数字:1073741824。将其乘以2,结果为负数(-2147483648)。将它乘以4,结果为零。

顺便说一句,如果你正在使用数字"它只包含因子2,3或5",换句话说数字2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 15, ...等,那么第1,000个数字那个序列不应该那么大。根据我的计算,结果应该只是1365