loay hoay với vòng lặp mà không biết làm (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

paradise_ndk

Thành viên mới
Tham gia
9/11/07
Bài viết
7
Được thích
0
em chào cả nhà. em đang có bài toán thế này mà không biết dùng vba để làm. các cao thủ giúp em với ạ
em đang có 4 biến x, y ,z, t chạy từ 1 đến 100
em có 1 hằng số cho trước giờ em đang muốn chọn các cặp (x*y)/(z*T) sao cho nó gần sát với hằng số kia nhất. (có thể là hiện bảng 20, 30 cặp gì đấy để chọn sao cho phù hợp vì có thể x,y,z,t em đã có sẵn 1 2 cái rồi chả hạn)
các cao thủ giúp em với ạ.
!$@!!!$@!!!$@!!!$@!!
đây em mò được 1 cặp giá trị đây ạ
 

File đính kèm

Lần chỉnh sửa cuối:
em chào cả nhà. em đang có bài toán thế này mà không biết dùng vba để làm. các cao thủ giúp em với ạ
em đang có 4 biến x, y ,z, t chạy từ 1 đến 100
em có 1 hằng số cho trước giờ em đang muốn chọn các cặp (x*y)/(z*T) sao cho nó gần sát với hằng số kia nhất. (có thể là hiện bảng 20, 30 cặp gì đấy để chọn sao cho phù hợp vì có thể x,y,z,t em đã có sẵn 1 2 cái rồi chả hạn)
các cao thủ giúp em với ạ.
!$@!!!$@!!!$@!!!$@!!
Bạn gửi bảng dữ liệu lên coi. Dữ liệu làm sao/ Kết quả ra sao? Bạn đã có sẵn 1 2 cái rồi thì cho luôn vô đó để làm mẫu.
 
Upvote 0
Mã:
linhcanh=10000000
    for x  =1 to 100
        for  y =1 to 100
            for z=1 to 100
               for t =1 to 100
                       if(linhcanh> abs( hangso - [COLOR=#000000](x*y)/(z*T))) then
[/COLOR]                                linhcanh=abs( hangso - [COLOR=#000000](x*y)/(z*T))
[/COLOR]                      end if
                next
           next
    next
next
xem ý tưởng này xem sao
dạ, ngôn ngữ lập trình này em cũng chưa thạo em khai báo dim... rồi nhưng nó không chạy bác ạ
em gửi file bác thử tham khảo giúp em
 

File đính kèm

Upvote 0
Bạn gửi bảng dữ liệu lên coi. Dữ liệu làm sao/ Kết quả ra sao? Bạn đã có sẵn 1 2 cái rồi thì cho luôn vô đó để làm mẫu.
dạ file của em đây, cái này em chọn mò được 1 cặp. vì cái z, t em đã có sẵn
có những trường hợp em không có sẵn thì em muốn tối ưu tất cả x,y,z,t -\\/.-\\/.
 
Upvote 0
dạ file của em đây, cái này em chọn mò được 1 cặp. vì cái z, t em đã có sẵn
có những trường hợp em không có sẵn thì em muốn tối ưu tất cả x,y,z,t -\\/.-\\/.
PHP:
Sub cap_so()
Dim a&: a = 5 'Số cần tham chiếu
Dim x, y, z, t, i
i = 1
For x = 1 To 20
    For y = 1 To 20
        For z = 1 To 20
            For t = 1 To 20
                If Abs((x * y) / (z * t) - a) < 1 Then 'Gần sát bao nhiêu thì nhập vào đó.
                    Sheet1.Range("A2").Offset(i - 1, 0) = x
                    Sheet1.Range("A2").Offset(i - 1, 1) = y
                    Sheet1.Range("A2").Offset(i - 1, 2) = z
                    Sheet1.Range("A2").Offset(i - 1, 3) = t
                    i = i + 1
                End If
            Next t
        Next z
    Next y
Next x
End Sub
Tôi để x=1 to 100 treo máy tính luôn nên để xuống = 20 (mất khoảng 3s).
 
Upvote 0
PHP:
Sub cap_so()
Dim a&: a = 5 'Số cần tham chiếu
Dim x, y, z, t, i
i = 1
For x = 1 To 20
    For y = 1 To 20
        For z = 1 To 20
            For t = 1 To 20
                If Abs((x * y) / (z * t) - a) < 1 Then 'Gần sát bao nhiêu thì nhập vào đó.
                    Sheet1.Range("A2").Offset(i - 1, 0) = x
                    Sheet1.Range("A2").Offset(i - 1, 1) = y
                    Sheet1.Range("A2").Offset(i - 1, 2) = z
                    Sheet1.Range("A2").Offset(i - 1, 3) = t
                    i = i + 1
                End If
            Next t
        Next z
    Next y
Next x
End Sub
Tôi để x=1 to 100 treo máy tính luôn nên để xuống = 20 (mất khoảng 3s).
em thử như thế này nhưng không được
Sub cap_so()
Dim a&: a = 0.54 'S? c?n tham chi?u
Dim x As Integer
Dim y As Integer
Dim z As Integer
Dim t As Integer
i = 1
For x = 18 To 30
For y = 30 To 50
For z = 30 To 60
For t = 50 To 90
If Abs((x * y) / (z * t) - a) < 0.01 Then 'G?n sát bao nhiêu thì nh?p vào dó.
Sheet1.Range("A2").Offset(i - 1, 0) = x
Sheet1.Range("A2").Offset(i - 1, 1) = y
Sheet1.Range("A2").Offset(i - 1, 2) = z
Sheet1.Range("A2").Offset(i - 1, 3) = t
i = i + 1
End If
Next t
Next z
Next y
Next x
End Sub
 
Upvote 0
Sửa theo code bài #6:
Mã:
Sub cap_so()
Dim rsArr(1 To 65535, 1 To 5)
Dim a&, b&, x, y, z, t, i, m, n
m = 2 'So thap phan
n = 500 'Tim n cap
a = Round(0.54, m) * 10 ^ m 'S? c?n tham chi?u
For x = 18 To 30
    For y = 30 To 50
        For z = 30 To 60
            For t = 50 To 90
                b = Round((x * y) / (z * t), m) * 10 ^ m
                If i = n Or i >= 65535 Then Exit For
                If b = a Then 'G?n sát bao nhiêu thì nh?p vào dó.
                    i = i + 1
                    rsArr(i, 1) = x: rsArr(i, 2) = y
                    rsArr(i, 3) = z: rsArr(i, 4) = t: rsArr(i, 5) = b / (10 ^ m)
                End If
            Next t
        Next z
    Next y
Next x
If i Then
    With Sheet1
        .Range([A2], .[A65535].End(3).Offset(1)).Resize(, 5).Clear
        .Range("A2").Resize(i, 5) = rsArr
    End With
End If
End Sub
Chú ý m (lấy giá trị thập phân m số) và n (lấy n cặp giá trị thỏa mãn).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sửa theo code bài #6:
Mã:
Sub cap_so()
Dim rsArr(1 To 65535, 1 To 5)
Dim a&, b&, x, y, z, t, i, m, n
m = 2 'So thap phan
n = 500 'Tim n cap
a = Round(0.54, m) * 10 ^ m 'S? c?n tham chi?u
For x = 18 To 30
    For y = 30 To 50
        For z = 30 To 60
            For t = 50 To 90
                b = Round((x * y) / (z * t), m) * 10 ^ m
                If i = n Or i >= 65535 Then Exit For
                If b = a Then 'G?n sát bao nhiêu thì nh?p vào dó.
                    i = i + 1
                    rsArr(i, 1) = x: rsArr(i, 2) = y
                    rsArr(i, 3) = z: rsArr(i, 4) = t: rsArr(i, 5) = b / (10 ^ m)
                End If
            Next t
        Next z
    Next y
Next x
If i Then
    With Sheet1
        .Range([A2], .[A65535].End(3).Offset(1)).Resize(, 5).Clear
        .Range("A2").Resize(i, 5) = rsArr
    End With
End If
End Sub
Chú ý m (lấy giá trị thập phân m số) và n (lấy n cặp giá trị thỏa mãn).
em đã thử nhưng vấn không thành công các bác ạ
Sub cap_so()
Dim rsArr(1 To 65535, 1 To 5)
Dim a&, b&, x, y, z, t, i, m, n
m = 8 'So thap phan
n = 1000 'Tim n cap
a = Round(0.49263041, m) * 10 ^ m 'S? c?n tham chi?u
For x = 27 To 30
For y = 30 To 50
For z = 30 To 60
For t = 80 To 90
b = Round((x * y) / (z * t), m) * 10 ^ m
If i = n Or i >= 65535 Then Exit For
If b <= a And b > (a + 20) Then 'G?n sát bao nhiêu thì nh?p vào dó.
i = i + 1
rsArr(i, 1) = x: rsArr(i, 2) = y
rsArr(i, 3) = z: rsArr(i, 4) = t: rsArr(i, 5) = b / (10 ^ m)
End If
Next t
Next z
Next y
Next x
If i Then
With Sheet1
.Range([A2], .[A65535].End(3).Offset(1)).Resize(, 5).Clear
.Range("A2").Resize(i, 5) = rsArr
End With
End If
End Sub
 
Upvote 0
Lấy chính xác đến 8 số thập phân làm sao ra?
Điều kiện b>a+20 nghĩa là bạn lấy thêm 20 đơn vị.
Kết hợp 2 điều trên sẽ thấy rất nghịch lý.
Thử lại file đính kèm dưới và test khi thay đổi các giá trị K5:K7.
VD: với m = 4, và điều kiện gần đúng, chỉ tìm được 1 cặp 4 số thỏa điều kiện thôi.
 

File đính kèm

Upvote 0
Lấy chính xác đến 8 số thập phân làm sao ra?
Điều kiện b>a+20 nghĩa là bạn lấy thêm 20 đơn vị.
Kết hợp 2 điều trên sẽ thấy rất nghịch lý.
Thử lại file đính kèm dưới và test khi thay đổi các giá trị K5:K7.
VD: với m = 4, và điều kiện gần đúng, chỉ tìm được 1 cặp 4 số thỏa điều kiện thôi.
em cảm ơn bác. em hiểu rồi ạ.
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom