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

Liên hệ QC

congthanh6868

Thành viên thường trực
Tham gia
30/5/09
Bài viết
322
Được thích
63
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.
 

File đính kèm

  • Tinh to hop bang Excel.xls
    14 KB · Đọc: 534
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.
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ì?
 
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ì?

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.
 
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.
Hỏi thêm:
- Tại sao kết quả có số 36 mà không phải là 63 vậy?
 
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.
 
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.
Hơi vả!
PHP:
Function CombinNum(Num As String, Optional Sep As String = " ") As String
  Dim i As Long, j As Long, Dic1, Dic2, Temp1, Temp2, CNum As String, Temp, StrSort As String
  Set Dic1 = CreateObject("Scripting.Dictionary")
  Set Dic2 = CreateObject("Scripting.Dictionary")
  StrSort = Num
  With WorksheetFunction
    For i = 1 To Len(StrSort) - 1
      For j = i + 1 To Len(StrSort)
        If Mid(StrSort, j, 1) < Mid(StrSort, i, 1) Then
          StrSort = .Replace(.Replace(StrSort, i, 1, Mid(StrSort, j, 1)), j, 1, Mid(StrSort, i, 1))
        End If
      Next j
    Next i
  End With
  For i = 1 To Len(StrSort)
    If Not Dic1.Exists(Mid(StrSort, i, 1)) Then
      Dic1.Add Mid(StrSort, i, 1), ""
    End If
  Next i
  Temp1 = Dic1.Keys
  For i = 0 To UBound(Temp1) - 1
    For j = i + 1 To UBound(Temp1)
      CNum = CStr(Temp1(i) & Temp1(j))
      If Not Dic2.Exists(CNum) Then
        Dic2.Add CNum, ""
      End If
    Next j
  Next i
  CombinNum = Join(Dic2.Keys, Sep)
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
 

File đính kèm

  • Tinh to hop bang Excel.xls
    24.5 KB · Đọc: 318
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.
 

File đính kèm

  • Excel bao loi.doc
    34.5 KB · Đọc: 48
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.
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.
 
Một cách khác:
PHP:
Function MyFunction(Str As String) As String
Dim MyStr As String, i As Byte, j As Byte
For i = 0 To 9
If InStr(Str, i) Then MyStr = MyStr & i
Next
For i = 1 To Len(MyStr) - 1
    For j = i + 1 To Len(MyStr)
        MyFunction = MyFunction & Mid(MyStr, i, 1) & Mid(MyStr, j, 1) & " "
    Next
Next
MyFunction = Trim(MyFunction)
End Function
 

File đính kèm

  • UDF.xls
    45.5 KB · Đọc: 218
Lần chỉnh sửa cuối:
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.
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!
 
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.
 
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 Long, Ww As Long, Zz As Long, Ff As Long, MyColor 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, Ww, Ff, jJ
 [b1].Interior.ColorIndex = IIf(MyColor > 42, 34, MyColor)
End Sub

Còn thiếu các nhóm số nữa.
 
Chỉnh sửa lần cuối bởi điều hành viên:
PHP:
Option Explicit
Sub ToHopChap4Cua10()
 Dim jJ As Long, Ww As Long, Zz As Long, Ff As Long, MyColor 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, Ww, Ff, jJ
 [b1].Interior.ColorIndex = IIf(MyColor > 42, 34, MyColor)
End Sub

Còn thiếu các nhóm số nữa.

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é.
 
Đề 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
 
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
 
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:
có ace nào chuyên VBA giúp e dzới
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:
thuyliênvn 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
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
 
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
 
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

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ể
 

File đính kèm

  • lietke.xlsx
    9.9 KB · Đọc: 49
Web KT
Back
Top Bottom