Mừng Sinh Nhật GPE 11: sáng 25/6 Hà Nội; 1/7 Huế/Đà Nẵng; Trưa 2/7 TPHCM

Tính Tổ hợp bằng Excel

Thảo luận trong 'Hướng dẫn sử dụng các hàm trong Excel' bắt đầu bởi congthanh6868, 25 Tháng hai 2010.

  1. congthanh6868

    congthanh6868 Thành viên thường trực

    Chào các bạn. Mình có bài dạng tính Tổ hợp, không biết dùng Excel có làm được không? Yệu cầu là từ môt số có 3 đến 9 số, tìm ra các số có 2 chữ số không trùng nhau. Ví dụ: có số 3869 thì sẽ tính ra là: 36 38 39 68 69 89. Các bạn xem thêm trong file đính kèm.
    Bạn nào biết thì giúp mình với. Cám ơn các bạn nhiều.
     

    Các file đính kèm:

  2. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Bạn vui lòng nói rõ lại vụ KHÔNG TRÙNG này nhé:
    - Không trùng nghĩa là 2 chữ số trong 1 số không trùng nhau
    Hay:
    - Không trùng nghĩa là số này không trùng số kia
    Lấy ví vụ:
    - Số 2663 bạn muốn ra kết quả gì?
    - Số 4444 bạn muốn ra kết quả gì?
     
  3. congthanh6868

    congthanh6868 Thành viên thường trực

    Xin lỗi, mình giải thích không rõ. Không trùng ở đây nghĩa là cả hai trường hợp Không trùng mà bạn đưa ra.
    Ví dụ: 2663 thì cần ra kết quả là 23 26 36
    còn 44444 thì không phải tính vì chỉ có 1 số 4 nên không hình thành só có 2 chữ số khác nhau được.
    (trường hợp xấu nhất thì vẫn chấp nhận ra kết quả trùng nhau, khi đó mình sẽ dùng công thức Joinunique mà bạn đã giúp đỡ)
    Cám ơn bạn nhiều.
     
  4. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Hỏi thêm:
    - Tại sao kết quả có số 36 mà không phải là 63 vậy?
     
  5. congthanh6868

    congthanh6868 Thành viên thường trực

    vì thực ra thì 63 cũng là trùng với 36, chỉ là viết ngược lại, và yêu câu đề bài phải là 36.
     
  6. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Hơi vả!
    PHP:
    Function CombinNum(Num As StringOptional Sep As String " ") As String
      Dim i 
    As LongAs LongDic1Dic2Temp1Temp2CNum As StringTempStrSort As String
      Set Dic1 
    CreateObject("Scripting.Dictionary")
      
    Set Dic2 CreateObject("Scripting.Dictionary")
      
    StrSort Num
      With WorksheetFunction
        
    For 1 To Len(StrSort) - 1
          
    For 1 To Len(StrSort)
            If 
    Mid(StrSortj1) < Mid(StrSorti1Then
              StrSort 
    = .Replace(.Replace(StrSorti1Mid(StrSortj1)), j1Mid(StrSorti1))
            
    End If
          
    Next j
        Next i
      End With
      
    For 1 To Len(StrSort)
        If 
    Not Dic1.Exists(Mid(StrSorti1)) Then
          Dic1
    .Add Mid(StrSorti1), ""
        
    End If
      
    Next i
      Temp1 
    Dic1.Keys
      
    For 0 To UBound(Temp1) - 1
        
    For 1 To UBound(Temp1)
          
    CNum CStr(Temp1(i) & Temp1(j))
          If 
    Not Dic2.Exists(CNumThen
            Dic2
    .Add CNum""
          
    End If
        
    Next j
      Next i
      CombinNum 
    Join(Dic2.KeysSep)
    End Function
    Phài sort chuổi, lọc lấy các ký tự duy nhất rồi ráp lại
    Gấp quá nên code dài ---> Sẽ nghiên cứu cải tiến sau
     

    Các file đính kèm:

  7. congthanh6868

    congthanh6868 Thành viên thường trực

    Excel báo lỗi

    Cám ơn bạn. Nhưng khi mình nhập công thức của bạn vào thì Excel của mình báo lỗi như sau, xem file đính kèm. Truòng hợp này thì phải xử lý ra sao, bạn giúp mình với.
     

    Các file đính kèm:

  8. congthanh6868

    congthanh6868 Thành viên thường trực

    Mình đã tự xử lý vấn đề này được rồi. Giờ thì đã sử dụng được Công thức do bạn giúp đỡ. Cám ơn Bạn ndu96081631 rất nhiều. Excel thật là tuyệt vời, và kiến thức về Excel của bạn thật uyên thâm.
     
  9. huuthang_bd

    huuthang_bd Thay thái độ đổi cuộc đời

    Một cách khác:
    PHP:
    Function MyFunction(Str As String) As String
    Dim MyStr 
    As StringAs ByteAs Byte
    For 0 To 9
    If InStr(StriThen MyStr MyStr i
    Next
    For 1 To Len(MyStr) - 1
        
    For 1 To Len(MyStr)
            
    MyFunction MyFunction Mid(MyStri1) & Mid(MyStrj1) & " "
        
    Next
    Next
    MyFunction 
    Trim(MyFunction)
    End Function
     

    Các file đính kèm:

    • UDF.xls
      Kích thước:
      45.5 KB
      Đọc:
      204
    Lần chỉnh sửa cuối: 26 Tháng hai 2010
  10. ndu96081631

    ndu96081631 Ăn cùng GPE, Ở cùng GPE, Sống cùng GPE Staff Member Super Moderator

    Bạn lưu ý:
    - Nếu dữ liệu của bạn toàn số thì có thể dùng hàm của Huuthang_bd, sẽ ngắn gọn hơn
    - Hàm tôi đưa lên ở trên là áp dụng cho mọi kiểu dữ liệu, ký tự number hay AlphaB gì gì cũng chơi tuốt!
     
  11. congthanh6868

    congthanh6868 Thành viên thường trực

    Có thể sửa đổi công thức trên để tìm ra các số có 4 số khác nhau từ 10 số tự nhiên: 0123456789 không các bạn nhỉ? Mong các bạn giúp đỡ. Cám ơn các bạn.
     
  12. HYen17

    HYen17 Thành viên cằn cỗi.

    Bạn kiểm theo kết quả của macro này xem thử, mình chưa viết được hàm lúc này

    PHP:
    Option Explicit
    Sub ToHopChap4Cua10
    ()
     
    Dim jJ As LongWw As LongZz As LongFf As LongMyColor As Byte
     
     MyColor 
    = [b1].Interior.ColorIndex 1
     Columns
    ("B:B").ClearContents
     
    [b1].Value "GPE"
     
    For jJ 9 To 0 Step -1
       
    For Ff jJ 1 To 0 Step -1
          
    For Ww Ff 1 To 0 Step -1
             
    For Zz Ww 1 To 0 Step -1
                With 
    [B65500].End(xlUp).Offset(1)
                   .
    Value jJ 1000 Ff 100 Ww 10 Zz
                End With
     Next Zz
    WwFfjJ
     
    [b1].Interior.ColorIndex IIf(MyColor 4234MyColor)
    End Sub 
    Còn thiếu các nhóm số nữa.
     
    Lần chỉnh sửa cuối: 25 Tháng ba 2010
  13. congthanh6868

    congthanh6868 Thành viên thường trực

    Bạn có thể viết giúp mình hàm hoàn chỉnh được không? Vì mình chỉ biết sơ sơ về excel. Để viết hay chỉnh sửa hàm thì mình chịu. Cám ơn bạn nhiều nhé.
     
  14. congtruocvn

    congtruocvn Thành viên mới

    Đề tài này có lẽ đã khá lâu rồi ko có ai để ý đến; Hôm nay mình có 1 bài toán muốn nhờ các bạn cao thủ giải giúp; Đề bài như sau: Cho 1 dãy các số thập phân, vd : 1,87; 1,1 ; 1,45; 1,67; 2,34; 1,1; 2,05; 1,87;2,08 ;.....dãy số này gồm n số, có giá trị sẽ lặp lại nhiều lần; Yêu cầu đặt ra là đưa ra 1 dãy số con của dãy số đã cho, nhằm thỏa mãn đk tổng các số thuộc dãy số con < 6 và tiến gần đến 6 nhất, vd : 1,1 + 1,45 + .....= 5,86 và 1,67 + 2,34 + ... = 5,90 thì ta sẽ chọn lấy 5,90, đề bài này mình đã cố gắng tìm lời giải mà đành bó tay; hy vọng sớm có cao thủ giúp mình giải quyết bài toán này, Thanks
     
  15. thuyliênvn

    thuyliênvn Thành viên mới

    mình cũng gặp vấn đề giống như trên, nhưng khác chút xíu là mình muốn tổ hợp hết các trường hợp - kể cả trùng kết quả và từng kết quả được xuất ra từng ô riêng biệt
    Thí dụ:
    2657
    sẽ có kết quả từng hàng như sau:
    26
    25
    27
    65
    67
    62
    57
    52
    56
    mong các bạn giúp đỡ tạo hàm giúp mình
     
  16. haonlh

    haonlh Thành viên tích cực

    Một số câu hỏi thêm trong đề tài cốt để làm rõ yêu cầu của người viết. Nếu khái niệm "Tổ hợp" được hiểu đúng như toán trình bày thì:
    Một tập luôn có tập con
    Số tập con có k phần tử của tập có n (0<= k <= n) phần tử được gọi là tổ hợp chập k của n.

    Chữ "tập hợp" cũng được hiểu đơn giản là 1 danh sách không có trùng nhau, không tính thứ tự.

    Vậy nên "tìm ra các số có 2 chữ số không trùng nhau" (trích từ #1) là không cần thiết.

    Nếu tập con có tính đến thứ tự (35 <> 53) thì đó là chỉnh hợp. Chỉnh hợp chập n của n là mọi hoán vị của tập có n phần tử.

    Bài #1 mới hỏi tổ hợp chập 2 của n. Tôi muốn nhắc lại để các câu hỏi sau theo tinh thần đó

    Muốn hỏi:
    Liệt kê mọi tổ hợp chập k của n
    Liệt kê mọi chỉnh hợp chập k của n
    (tập n được chọn là dãy số từ 1 đến n)
    Xin cảm ơn
     
    Lần chỉnh sửa cuối: 1 Tháng bảy 2013
  17. thuyliênvn

    thuyliênvn Thành viên mới

    có ace nào chuyên VBA giúp e dzới
     
  18. concogia

    concogia Gội rồi mới Cạo

    Muốn "giúp e dzới" dzị bạn ghi lại cái kết quả đầy đủ xem sao, cái này:
    Hình như nó thiếu thiếu thế nào í
    Rồi, thí dụ 3443 ==> kết quả ???
    Làm vài cái ví dụ nữa đi cho rõ đề bài bạn nhé
    Thân
     
  19. thuyliênvn

    thuyliênvn Thành viên mới

    bạn ơi, thì nó sẽ có kết quả như sau:
    3443
    ------
    34
    34
    33
    44
    43
    43
    43
    43
    43
    giúp mình nhé bạn
    ý mình là mọi trường hợp đều phải có, cho dù số đó có trùng lắp
     
  20. siwtom

    siwtom Thành viên bị đình chỉ hoạt động

    Qui tắc ở bài này và bài #15 không giống nhau.
    Với số 3443 mà theo qui tắc của bài #15 thì kết quả phải là.
    34
    34
    33
    44
    43
    43
    43
    43
    44

    Hoặc là bạn viết nhầm kết quả cuối cùng.

    Qui tắc bài #15 là: Ta liệt kê lần lượt các số có 2 chữ số mà chữ số hàng chục là mỗi chữ số của số nguồn loại trừ chữ số cuối. Nếu số nguồn là a1a2...a(n-1)an - với a1, ..., an là các chữ số - thì kết quả là:
    a1a2
    ...
    a1an
    a2a3
    a2a3
    ...
    a2an
    a2a1
    ...
    a(n-1)an
    a(n-1)a1
    ...
    a(n-1)a(n-2)
    ----------------
    Giữ liệu của bạn có nhiều không? Ta chơi công thức nhé.

    Giả sử bạn có các số khác nhau nằm tại dòng 1 - A1, B1, C1, ...
    Công thức cho A2

    Mã:
    =IF(LEN(A$1) < 2;"";IF(ROWS($1:1)>(LEN(A$1)-1)^2;"";--(MID(A$1;
    INT((ROWS($1:1)-1)/(LEN(A$1)-1))+1;1)&MID(A$1;MOD(INT((ROWS($1:1)-1)/(LEN(A$1)-1))+1+
    MOD(ROWS($1:1)-1;LEN(A$1)-1);LEN(A$1))+1;1))))
    
    Kéo sang phải và kéo xuống dưới
    ----------------
    Bạn tự rút gọn công thức nếu có thể
     

    Các file đính kèm:

Chia sẻ trang này