2017-07-31 115 views
0

一个巨大的数字分配给一个变量跳出while循环的我想写一个程序,可以找到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时,输入的号码变大。

回答

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

+1

在函数中使用'BigInt'(http://www.scala-lang.org/api/2.12.0/scala/math/BigInt.html)而不是'Int'。这应该解决问题。 – tobi

+0

Thanks.It适用于'BigInt'。但实际上,号码列表应该是2,3,4,5,6,8,9,10,12,15 .....并且不包含14,这是2 * 7。 –