我想编写一个程序,可以找到第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。
答案 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
。