Nhờ giúp đỡ về bài toán tổ hợp

Liên hệ QC

thanhkel1990

Thành viên mới
Tham gia
4/10/09
Bài viết
8
Được thích
0
Như tiêu đề, cháu cần sự giúp đỡ của các cô chú về bài toán tổ hợp: có 10 số từ 0-9, cháu cần liệt kê các số được tạo ngẫu nhiên từ 4 trong 10 số đó, cột A là danh sách các số có 4 chữ số giống nhau ( ví dụ aaaa), cột B là danh sách các số có 3 chữ số giống nhau ( ví dụ aaab), cột C là danh sách có 2 cặp chữ số giống nhau ví dụ (aabb, cddc), cột D là danh sách các số có 2 chữ số giống nhau và 2 chữ số còn lại khác nhau ví dụ (aabc, bbcd) ,cột E là danh sách các số có 4 chữ số khác nhau hoàn toàn. Ngoài ra thì còn 1 yêu cầu phụ nữa là trong 1 cột, các số được cấu thành từ 4 chữ số giống nhau nhưng khác nhau vị trí thì sẽ chỉ xuất hiện 1 lần duy nhất ( ví dụ cột C có các số aabb, abba, bbaa.... thì sau khi ra kết quả chỉ còn giữ lại 1 số aabb làm đại diện)
Rất mong nhận được sự giúp đỡ thì các cô chú trong diễn đàn ạ, cháu xin cám ơn!
 
bạn xem thử nha !
 

File đính kèm

  • abc.xlsm
    24.4 KB · Đọc: 16
Dựa vào code của anhtuanle123 tôi đã sửa lại như sau:
PHP:
Sub combination1()
[A1:E10000].ClearContents
  Dim a%, b%, c%, d%
  Dim ia&, ib&, ic&, id&, ie&
    For a = 0 To 9
        For b = 0 To 9
            For c = 0 To 9
                For d = 0 To 9
                    If Int(a & b & c & d) Mod 1111 = 0 Then
                      ia = ia + 1: Cells(ia, 1) = a & b & c & d
                    ElseIf Int(a & b & c) Mod 111 = 0 Or Int(b & c & d) Mod 111 = 0 Then
                      ib = ib + 1: Cells(ib, 2) = a & b & c & d
                    ElseIf a < c And Int(a & b) Mod 11 = 0 And Int(c & d) Mod 11 = 0 Then
                      ic = ic + 1: Cells(ic, 3) = a & b & c & d
                    ElseIf  c <> d And Int(a & b) Mod 11 = 0 Then
                      id = id + 1: Cells(id, 4) = a & b & c & d
                    ElseIf a <> b And a <> c And a <> d And b <> c And b <> d And c <> d Then
                      ie = ie + 1: Cells(ie, 5) = a & b & c & d
                    End If
     Next d, c, b, a
End Sub
 
Lần chỉnh sửa cuối:
mình nhìn đề ko kỹ thiếu mất cột E ^^
thank bác HeSanbi đã quan tâm code bài của mình , nhưng mà góp ý nhỏ cho bác là vòng lặp theo như của bác thì gọi là chỉnh hợp , ko phải là tổ hợp , vì chỉnh hợp nên kết quả sẽ bị lặp lại , ví dụ cột 2 của bác có 2 giá trị lặp lại là 1112 và 2111
cách vận dụng phép toán Mod để xét điều kiện cũng là 1 phát kiến tinh tế ^^
 
mình nhìn đề ko kỹ thiếu mất cột E ^^
thank bác HeSanbi đã quan tâm code bài của mình , nhưng mà góp ý nhỏ cho bác là vòng lặp theo như của bác thì gọi là chỉnh hợp , ko phải là tổ hợp , vì chỉnh hợp nên kết quả sẽ bị lặp lại , ví dụ cột 2 của bác có 2 giá trị lặp lại là 1112 và 2111
cách vận dụng phép toán Mod để xét điều kiện cũng là 1 phát kiến tinh tế ^^
Thì giấu đoạn này đi
Mã:
Or Int(b & c & d) Mod 111 = 0
 
Lần chỉnh sửa cuối:
.... .
 
Lần chỉnh sửa cuối:
Dựa vào code của anhtuanle123 tôi đã sửa lại như sau:
PHP:
Sub combination1()
[A1:E10000].ClearContents
  Dim a%, b%, c%, d%
  Dim ia&, ib&, ic&, id&, ie&
    For a = 0 To 9
        For b = 0 To 9
            For c = 0 To 9
                For d = 0 To 9
                    If Int(a & b & c & d) Mod 1111 = 0 Then
                      ia = ia + 1: Cells(ia, 1) = a & b & c & d
                    ElseIf Int(a & b & c) Mod 111 = 0 Or Int(b & c & d) Mod 111 = 0 Then
                      ib = ib + 1: Cells(ib, 2) = a & b & c & d
                    ElseIf a < c And Int(a & b) Mod 11 = 0 And Int(c & d) Mod 11 = 0 Then
                      ic = ic + 1: Cells(ic, 3) = a & b & c & d
                    ElseIf  c <> d And Int(a & b) Mod 11 = 0 Then
                      id = id + 1: Cells(id, 4) = a & b & c & d
                    ElseIf a <> b And a <> c And a <> d And b <> c And b <> d And c <> d Then
                      ie = ie + 1: Cells(ie, 5) = a & b & c & d
                    End If
     Next d, c, b, a
End Sub
Thử so sánh kết quả 2 bạn thấy khác nhau
 

File đính kèm

  • abc.xlsm
    88.2 KB · Đọc: 4
Thì giấu đoạn này đi
Mã:
Or Int(b & c & d) Mod 111 = 0
xem lại thì file của mình sai roài , thiếu 1 số trường hợp nên không dùng vòng lặp tổ hợp được , phải dùng vòng lặp như của bác mới quét được hết các trường hợp ^^

Thử so sánh kết quả 2 bạn thấy khác nhau

đúng rùi , file của mình dùng tổ hợp ( số sau = hoặc lớn hơn số trước ) nên sẽ có các trường hợp ở cột 2 như là 2223 , 2224 , nhưng thiếu 2220 , 2221 ^^
 
xem lại thì file của mình sai roài , thiếu 1 số trường hợp nên không dùng vòng lặp tổ hợp được , phải dùng vòng lặp như của bác mới quét được hết các trường hợp ^^
Quét 0 tới 9 sẽ có trường hợp trùng và dữ liệu nhiều hơn chạy hơi chậm, cách chạy nối tiếp nhanh hơn và không trùng, chỉ cần lấy thêm kết quả là được
 
Lấy các kết quả ở trong vòng for cuối làm việc xét điều kiện hơi phức tạp, bài toán nên nên chuyển thành 4 trường hợp:
1/ lấy 1 số trong 10 số, lấy kết quả ở For thứ nhất
2/ lấy 2 số trong 10 số, với 3 dạng aabb, aaab, abbb, lấy kết quả ở For thứ 2
3/ lấy 3 số trong 10 số, với 3 dạng aabc, abbc, abcc, lấy kết quả ở For thứ 3
4/ lấy 4 số trong 10 số, lấy kết quả ở For thứ 4
 
à hình như điều kiện của mình sai , vì là aaab hay là aaba hoặc abaa hoặc baaa thì cũng như nhau thôi đúng không nhỉ ,
cũng là nó thôi vì chỉ khác vị trí tí

mình sửa lại điều kiện thứ 2
If (a = b And a = c And a <> d) Or (a = b And a <> c And a = d) Or (a <> b And a = c And a = d) Then
thay bằng
If (a = b And a = c And a <> d) Or (a = b And a <> c And a = d) Or (a <> b And b = c And b = d) Then
 

File đính kèm

  • abc 2.xlsm
    77 KB · Đọc: 10
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom