2017-07-31 63 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。 –