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

thanhkel1990

Thành viên mới
Tham gia ngày
4 Tháng mười 2009
Bài viết
8
Thích
0
Điểm
363
Tuổi
34
#1
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!
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
676
Thích
408
Điểm
435
#3
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:

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
264
Thích
121
Điểm
395
Tuổi
34
#4
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ế ^^
 

HeSanbi

Thành viên tích cực
Tham gia ngày
24 Tháng hai 2013
Bài viết
676
Thích
408
Điểm
435
#5
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:

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
5,152
Thích
8,303
Điểm
560
#7
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

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
264
Thích
121
Điểm
395
Tuổi
34
#8
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 ^^
 

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
5,152
Thích
8,303
Điểm
560
#9
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
 

HieuCD

Thành viên gạo cội
Tham gia ngày
14 Tháng chín 2010
Bài viết
5,152
Thích
8,303
Điểm
560
#10
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
 

anhtuanle123

Thành viên thường trực
Tham gia ngày
8 Tháng sáu 2009
Bài viết
264
Thích
121
Điểm
395
Tuổi
34
#11
à 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

Lần chỉnh sửa cuối:
Top