2015-04-22 13 views
5

Tôi đang cố gắng kiểm tra xem một số đã cho là cuberoot hay không trong VBA.
Mã sau chỉ hoạt động cho 2 và 3 là câu trả lời, nó không hoạt động sau đó.
Tôi đang cố gắng tìm ra điều gì sai trong mã.Kiểm tra xem một số có số nguyên là số nguyên khối

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

Nếu tôi nhập '125', là khối lập phương của' 5', tôi nhận được câu trả lời chính xác 'Có phải khối lập phương' ngay cả khi bạn đang nói rằng nó chỉ hoạt động cho' 2' và '3'. Tôi nghĩ bạn nên làm rõ đầu vào là gì, đầu ra bạn mong đợi và đầu ra bạn nhận được để chúng tôi hiểu ý bạn là gì. Nếu không, tôi chỉ có thể nói rằng _given mô tả của bạn, mã của bạn sẽ hoạt động tốt. –

+0

@MatteoNNZ mà không có kích thước b miễn là mã trên không thành công cho tôi vì int (b) trả về 4. – brettdj

+0

@Apurva Tôi hy vọng bạn đã tìm thấy câu trả lời cho câu hỏi của bạn. Nếu vậy, thông thường ở đây để chấp nhận câu trả lời cung cấp giải pháp tốt nhất cho vấn đề của bạn. Bạn có thể đọc thêm về điều đó [ở đây] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – stucharo

Trả lời

2

Vì bạn đang đi qua trong một Long tôi sẽ giả định rằng bạn sẽ không có một số lượng lớn hơn khoảng 2 * 10^9 vì vậy đây luôn nên làm việc. Đó là một biến thể nhỏ, nơi bạn cắt đôi và sau đó so sánh với hai số nguyên gần nhất để đảm bảo bạn nắm bắt bất kỳ lỗi làm tròn nào.

Chỉnh sửa: Trong VBA sự cắt xén sẽ luôn tròn vì vậy nó chỉ cần thiết để kiểm tra giá trị gốc 3rd:

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 

Nếu bạn cần một số lớn hơn một Long bạn sẽ cần phải thay đổi loại đầu vào của bạn và bạn có thể muốn xem xét một phương pháp lặp như tìm kiếm nhị phân hoặc giải trình Newton-Raphson thay thế.

+0

Cách tiếp cận rất đẹp! –

+0

điều này làm việc cho tôi .... Cảm ơn !!! – Apurva

1

hiện Mã

Mã của bạn sẽ làm việc nếu bạn thêm một
dim b as long

Nếu bạn gỡ lỗi mã của bạn, bạn sẽ thấy thức ăn mà trong 125 mang đến cho bạn

b = 5
Int (b) = 4

Mã Cập nhật

Bạn có thể rút ngắn thời kiểm tra boolean của bạn để này

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

Lưu ý rằng nếu bạn gọi nó với một đôi, nó sẽ opearte trên chỉ có phần dài (vì vậy nó sẽ thấy IsCube(64.01) như IsCube(64))

Các vấn đề liên quan