2015-04-22 68 views
5

我正試圖檢查給定的數字是否是cuberoot或不在VBA中。
以下代碼僅適用於2和3作爲答案,此後不起作用。
我想弄清楚代碼中出了什麼問題。檢查數字是否具有整數立方根

Sub cuberoot() 
    Dim n As Long, p As Long, x As Long, y As Long 

    x = InputBox("x= ") 
    If Iscube(x) Then 
     MsgBox ("Is cube") 
    Else 
     MsgBox ("No cube") 
    End If 
End Sub 

Private Function Iscube(a As Long) As Boolean 
    b = a^(1/3) 
    If b = Int(b) Then 
     Iscube = True 
    Else 
     Iscube = False 
    End If 
End Function 
+0

如果我輸入'125',它是'5'的立方根,我正確地得到了'Is cube'的答案,即使你說它只適用於'2'和'3'。我想你應該明確什麼是輸入,輸出結果和輸出結果,以便我們理解你的意思。否則,我只能說_給你的描述,你的代碼應該很好地工作。 –

+0

@MatteoNNZ沒有維b只要上面的代碼失敗,因爲int(b)返回4. – brettdj

+0

@Apurva我希望你已經找到了你的問題的答案。如果是這樣,這裏習慣於接受爲您的問題提供最佳解決方案的答案。你可以閱讀更多關於[這裏](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – stucharo

回答

2

既然你傳遞一個Long我假設你不會有一個數比約爲2×10^9所以這應該總是工作更大。這是一個輕微的變化,你截斷雙精度,然後比較兩個最接近的整數,以確保你捕捉任何舍入誤差。

編輯:VBA的截斷會始終一輪所以才neccessary檢查3根值:如果你需要的不僅僅是Long你需要改變你的輸入型更大一些

Public Function Iscube(a As Long) As Boolean 

Dim b As Integer 
b = CInt(a^(1#/3#)) 

If (b^3 = a) Then 
    Iscube = True 
Else 
    Iscube = False 
End If 

End Function 

和您可能需要考慮像二分搜索或牛頓 - 拉夫遜解算器這樣的迭代方法。

+0

非常好的方法! –

+0

這爲我工作....謝謝! – Apurva

1

現有代碼

如果添加了
dim b as long

如果您調試代碼,你會看到,餵養125給你

B = 5,您的代碼將工作(b)= 4

更新的代碼

您可以縮短你的布爾測試這個

Function Iscube(lngIn As Long) As Boolean 
Iscube = (Val(lngIn^(1/3)) = Int(Val(lngIn^(1/3)))) 
End Function 

注意,如果你有雙調用它,它會opearte僅在長的部分(所以它會看到IsCube(64.01)爲)