Hướng dẫn dùm em cách tính số lần đảo thứ tự chữ số trong 1 số

Liên hệ QC

hayvoc

Thành viên mới
Tham gia
30/11/08
Bài viết
38
Được thích
3
Ví dụ :
em có số
- 123 đảo 6 vòng = 123, 132, 213, 231, 312, 321.
- 112 đảo 3 vòng = 112, 121, 211.
- 1234 đảo 24 vòng.
- 1123 đảo 12 vòng.
- 1122 đảo 6 vòng.
- 1112 đảo 4 vòng.
có nghĩa là em muốn excel hiểu :
- xyz = nếu x # y # z thì = 6
- xxy = nếu x = x # thì = 3
tương tự
- abcd = 24
- aabc = 12
- aabb = 6
- abbb = 4

Em phải sử dụng hàm gì để có thể nhận biết được con số đó đảo bao nhiêu vòng.
( đây là lần đầu tiên em vào diễn đàn, và đặt câu hỏi rất mong mấy anh chị giúp dùm em. )
 
Ví dụ :
em có số
- 123 đảo 6 vòng = 123, 132, 213, 231, 312, 321.
- 112 đảo 3 vòng = 112, 121, 211.
- 1234 đảo 24 vòng.
- 1123 đảo 12 vòng.
- 1122 đảo 6 vòng.
- 1112 đảo 4 vòng.
có nghĩa là em muốn excel hiểu :
- xyz = nếu x # y # z thì = 6
- xxy = nếu x = x # thì = 3
tương tự
- abcd = 24
- aabc = 12
- aabb = 6
- abbb = 4

Em phải sử dụng hàm gì để có thể nhận biết được con số đó đảo bao nhiêu vòng.
( đây là lần đầu tiên em vào diễn đàn, và đặt câu hỏi rất mong mấy anh chị giúp dùm em. )
Nói trước: Bài này chỉ có thể dùng phương pháp lập trình thôi
Gữi bạn code này:
Mã:
Dim Dic As Object
Sub Main()
  Dim sText As String
  Dim Arr(), Keys
  Dim t As Double, n As Long, lCount As Long
  t = Timer
  Set Dic = CreateObject("Scripting.Dictionary")
 [COLOR=#ff0000] [B]sText = "aabc"[/B][/COLOR]  '<--- Thay giá tri khác tùy ý
  UniquePermu "", sText
  If Dic.Count Then
    Range("A:A").ClearContents
    lCount = Dic.Count
    ReDim Arr(1 To lCount, 1 To 1)
    Keys = Dic.Keys
    For n = 1 To lCount
      Arr(n, 1) = Keys(n - 1)
    Next
    Range("A1").Resize(lCount) = Arr
    MsgBox lCount & " Items found!", , "(" & Format(Timer - t, "0.000") & "s)"
  End If
End Sub
Mã:
Sub UniquePermu(x As String, y As String)
  Dim i As Long, j As Long, tmp As String
  j = Len(y)
  If j < 2 Then
    tmp = x & y
    If Not Dic.Exists(tmp) Then Dic.Add tmp, ""
  Else
    For i = 1 To j
      UniquePermu x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i)
    Next
  End If
End Sub
Thay giá trị khác vào chổ màu đỏ nhé
 
Ví dụ :
em có số
- 123 đảo 6 vòng = 123, 132, 213, 231, 312, 321.
- 112 đảo 3 vòng = 112, 121, 211.
- 1234 đảo 24 vòng.
- 1123 đảo 12 vòng.
- 1122 đảo 6 vòng.
- 1112 đảo 4 vòng.
có nghĩa là em muốn excel hiểu :
- xyz = nếu x # y # z thì = 6
- xxy = nếu x = x # thì = 3
tương tự
- abcd = 24
- aabc = 12
- aabb = 6
- abbb = 4

Em phải sử dụng hàm gì để có thể nhận biết được con số đó đảo bao nhiêu vòng.
( đây là lần đầu tiên em vào diễn đàn, và đặt câu hỏi rất mong mấy anh chị giúp dùm em. )
Bạn dùng công thức mảng này thử xem:
Mã:
=FACT(LEN($A1))/PRODUCT(FACT(IF(FIND(MID($A1,ROW(INDIRECT("1:"&LEN($A1))),1),A1)=ROW(INDIRECT("1:"&LEN($A1))),LEN(A1)-LEN(SUBSTITUTE(A1,MID($A1,ROW(INDIRECT("1:"&LEN($A1))),1),"")),1)))
Trong công thức có vài đoạn giống nhau, bạn có thể đặt name cho công thức gọn lại.
 
Hỏng biết ndu có giải nhầm bài toán khác không ta? Đọc chả hiểu gì hết?

Bài này giải bằng UDF VBA như sau:

PHP:
Function FactUnique(MyStr) As Long
Dim i As Long, Dic As Object, Tmp As String
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To Len(MyStr)
    Tmp = Mid(MyStr, i, 1)
    If Not Dic.exists(Tmp) Then
        Dic.Add Tmp, ""
    End If
Next
FactUnique = Application.Fact(Dic.Count)
End Function

Cú pháp: =FactUnique(A1)
 
Hỏng biết ndu có giải nhầm bài toán khác không ta? Đọc chả hiểu gì hết?

Bài này giải bằng UDF VBA như sau:

PHP:
Function FactUnique(MyStr) As Long
Dim i As Long, Dic As Object, Tmp As String
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To Len(MyStr)
    Tmp = Mid(MyStr, i, 1)
    If Not Dic.exists(Tmp) Then
        Dic.Add Tmp, ""
    End If
Next
FactUnique = Application.Fact(Dic.Count)
End Function

Cú pháp: =FactUnique(A1)
Dạ! Bài toán liệt kê nó khó hơn nhiều (em làm luôn).
Chứ còn chỉ đếm thôi thì... Ẹc... Ẹc... quá dễ:
Mã:
=FACT(SUMPRODUCT(1/(LEN(A1)-LEN(SUBSTITUTE(A1,MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),"")))))
 
Dạ! Bài toán liệt kê nó khó hơn nhiều (em làm luôn).
Chứ còn chỉ đếm thôi thì... Ẹc... Ẹc... quá dễ:
Mã:
=FACT(SUMPRODUCT(1/(LEN(A1)-LEN(SUBSTITUTE(A1,MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1),"")))))
Nói quá dễ thì hơi... quá. Công thức của anh chưa đúng. 112 cho kết quả là 2 trong khi phải là 3 mới đúng.
 
Nói quá dễ thì hơi... quá. Công thức của anh chưa đúng. 112 cho kết quả là 2 trong khi phải là 3 mới đúng.
Ah.. ha!
Cái lỗi này là tại.. Lão Chết Tiệt đấy nha!
Dựa vào hàm của Lão, tôi "dịch" ra thành công thức mà không cần kiểm tra kết quả
Vậy thì... Lão chịu trách nhiệm toàn bộ thôi
Ẹc... Ẹc...
-----------------------
Tôi vẫn linh cảm có 1 công thức "đếm" nào đó rất ngắn nhưng chưa nghĩ ra
Nghiên cứu tiếp thôi các đồng chí ơi!
 
Bạn dùng công thức mảng này thử xem:
Mã:
=FACT(LEN($A1))/PRODUCT(FACT(IF(FIND(MID($A1,ROW(INDIRECT("1:"&LEN($A1))),1),A1)=ROW(INDIRECT("1:"&LEN($A1))),LEN(A1)-LEN(SUBSTITUTE(A1,MID($A1,ROW(INDIRECT("1:"&LEN($A1))),1),"")),1)))
Trong công thức có vài đoạn giống nhau, bạn có thể đặt name cho công thức gọn lại.

Cám ơn anh nhiều lắm, tuy em ko biết rút gọn công thức nhưng như vậy là quá tuyệt vời rồi anh.
à anh ơi nếu ô A1 ko có số thì excel báo #REF!, vậy mình làm sao có thể hiển thị thành số 0 hoặc là ô trống được ko anh??
 
Lần chỉnh sửa cuối:
Cám ơn anh nhiều lắm, tuy em ko biết rút gọn công thức nhưng như vậy là quá tuyệt vời rồi anh.
à anh ơi nếu ô A1 ko có số thì excel báo #REF!, vậy mình làm sao có thể hiển thị thành số 0 hoặc là ô trống được ko anh??
Bạn dùng thêm một hàm IF() là được thôi mà:
Mã:
=IF(A1="",0,[Công thức cũ])
 
Lần chỉnh sửa cuối:
anh ơi bị lỗi rồi hay sao đó
133 = 6 sai đúng ra là = 3
1122, 1212 = 12 sai đúng ra là = 6
1233, 1332 = 24 sai, đúng ra là = 12
anh xem lại dùm em nha anh, ý của em là:
nếu 3 số # nhau = 6
nếu 3 số có 1 cặp số giống nhau = 3
nếu 4 số # nhau = 24
nếu 4 số có 1 cặp số giống nhau = 12
nếu 4 số có 2 cặp số giống nhau = 6
nếu 4 số có 3 số giống nhau = 4
 
anh ơi bị lỗi rồi hay sao đó
133 = 6 sai đúng ra là = 3
1122, 1212 = 12 sai đúng ra là = 6
1233, 1332 = 24 sai, đúng ra là = 12
anh xem lại dùm em nha anh, ý của em là:
nếu 3 số # nhau = 6
nếu 3 số có 1 cặp số giống nhau = 3
nếu 4 số # nhau = 24
nếu 4 số có 1 cặp số giống nhau = 12
nếu 4 số có 2 cặp số giống nhau = 6
nếu 4 số có 3 số giống nhau = 4
À há !!! Đây là bài toán ....số đề, chơi kiểu nông dân thôi
Xem thử trong file
Thân
 

File đính kèm

  • choi so de.xls
    17.5 KB · Đọc: 172
À há !!! Đây là bài toán ....số đề, chơi kiểu nông dân thôi
Xem thử trong file
Thân

12345 cũng ra 24? Ẹc ẹc

Bài toán này liên quan đến chỉnh hợp tổ hợp lặp chập chập lặp ...., cách tính số học quên mất tiu rồi.
 
Lần chỉnh sửa cuối:
12345 cũng ra 24? Ẹc ẹc
Hihi, Thầy Ptm không biết chơi số đề zồi, chỉ 2, 3 & 4 ký tự thôi ( hông có 5 ký tự đâu), 2 ký tự dễ tính, khó là 3 & 4 ký tự thôi ( nên chủ topic mới hỏi). Híc
Hihihi. Hổng tin Thầy hỏi chủ Topic này xem
 
Công thức tính số các chỉnh hợp lặp của n phần tử với tần số
e0ca80a4d8e9c0ddefb35053a14adcd0.png
6e4584ea18f487cf29d9e7be88541606.png
với
ef34bfddc851b2d8fcfc51b22d75d55c.png


Hỏng biết đúng hông nữa?
 
Kệ, ai chơi số đề là vi phạm pháp luật. Mình nghiên kiú chỉnh hợp lặp
PHP:
Function FactUnique(MyStr) As Long
Dim i As Long, Dic As Object, Tmp As String, ProductFact, ArrItem
Set Dic = CreateObject("Scripting.Dictionary")
For i = 1 To Len(MyStr)
    Tmp = Mid(MyStr, i, 1)
    If Not Dic.exists(Tmp) Then
        Dic.Add Tmp, 1
    Else
        Dic.Item(Tmp) = Dic.Item(Tmp) + 1
    End If
Next
ProductFact = 1
ArrItem = Dic.items
For i = 0 To Dic.Count - 1
    ProductFact = ProductFact * Application.Fact(ArrItem(i))
Next
FactUnique = Application.Fact(Len(MyStr)) / ProductFact
End Function
 
anh ơi bị lỗi rồi hay sao đó
133 = 6 sai đúng ra là = 3
1122, 1212 = 12 sai đúng ra là = 6
1233, 1332 = 24 sai, đúng ra là = 12
anh xem lại dùm em nha anh, ý của em là:
nếu 3 số # nhau = 6
nếu 3 số có 1 cặp số giống nhau = 3
nếu 4 số # nhau = 24
nếu 4 số có 1 cặp số giống nhau = 12
nếu 4 số có 2 cặp số giống nhau = 6
nếu 4 số có 3 số giống nhau = 4
Sai là do bạn không biết cách sử dụng công thức. Ở bài đầu tiên của tôi tôi đã nói rõ là dùng công thức mảng. Bạn dùng công thức bình thường thì kết quả sai là đúng rồi. Công thức mảng tức là nhập công thức xong bạn phải nhấn tổ hợp phím Ctrl + Shift + Enter để kết thúc thay vì Enter như thông thường.
Bạn thử nhập số vào file này xem có sai chỗ nào không.
 

File đính kèm

  • VD.xlsx
    7.7 KB · Đọc: 103
Sai là do bạn không biết cách sử dụng công thức. Ở bài đầu tiên của tôi tôi đã nói rõ là dùng công thức mảng. Bạn dùng công thức bình thường thì kết quả sai là đúng rồi. Công thức mảng tức là nhập công thức xong bạn phải nhấn tổ hợp phím Ctrl + Shift + Enter để kết thúc thay vì Enter như thông thường.
Bạn thử nhập số vào file này xem có sai chỗ nào không.

Hihi em ko biết anh thông cảm nha, bây giờ excel hiểu được 12345 = 120 vòng lun hay quá, cám ơn anh.
 
Web KT
Back
Top Bottom