[VBA] hoán vị dãy số

Liên hệ QC

NguyenNgocSon

KEEP WALKING
Tham gia
4/4/08
Bài viết
280
Được thích
833
Nghề nghiệp
Ths. Cầu hầm
Em có 1 dãy số sau: A={1,2,3,4,5,6}
Code VBA hoán vị như sau
1.Hoán vị 2 phần tử bất kỳ trong dãy(Ví dụ: A={1,2,3,4,5,6} => A={1,3,2,4,5,6},A={6,2,3,4,5,1},...
2.Hoán vị dãy giữ nguyên vị trí của 2 phần tử bất kỳ (ví dụ: A={1,2,3,4,5,6} => A={4,2,3,1,5,6},....
Cám ơn!
 
Em có 1 dãy số sau: A={1,2,3,4,5,6}
Code VBA hoán vị như sau
1.Hoán vị 2 phần tử bất kỳ trong dãy(Ví dụ: A={1,2,3,4,5,6} => A={1,3,2,4,5,6},A={6,2,3,4,5,1},...
2.Hoán vị dãy giữ nguyên vị trí của 2 phần tử bất kỳ (ví dụ: A={1,2,3,4,5,6} => A={4,2,3,1,5,6},....
Cám ơn!

Code hoán vị là cái này:
PHP:
Dim n As Long, Arr(1 To 362880, 1 To 1)
Sub GetPermu(x As String, y As String)
  Dim i As Long, j As Long
  j = Len(y)
  If j < 2 Then
    Arr(n, 1) = x & y
    n = n + 1
  Else
    For i = 1 To j
      GetPermu x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i)
    Next
  End If
End Sub
PHP:
Sub Main()
  Dim Num As String
  Num = "123456"
  n = 1
  GetPermu "", Num
  Range("A1").Resize(n - 1) = Arr
End Sub
Câu 2 cũng chẳng khó gì. Muốn giữ số nào thì cứ cắt bỏ nó, hoán vị những ký tự còn lại, xong "ráp" phần đã cắt vào kết quả
 
Lần chỉnh sửa cuối:
Upvote 0
Code hoán vị là cái này:
PHP:
Dim n As Long, Arr(1 To 362880, 1 To 1)
Sub GetPermu(x As String, y As String)
  Dim i As Long, j As Long
  j = Len(y)
  If j < 2 Then
    Arr(n, 1) = x & y
    n = n + 1
  Else
    For i = 1 To j
      GetPermu x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i)
    Next
  End If
End Sub
PHP:
Sub Main()
  Dim Num As String
  Num = "123456"
  n = 1
  GetPermu "", Num
  Range("A1").Resize(n - 1) = Arr
End Sub
Câu 2 cũng chẳng khó gì. Muốn giữ số nào thì cứ cắt bỏ nó, hoán vị những ký tự còn lại, xong "ráp" phần đã cắt vào kết quả
Cho em hỏi
GetPermu "", Num
Range("A1").Resize(n - 1) = Arr
Có ý nghĩa là như nào vì hàm GetPermu không thấy có liên quan đến Arr ?
Cám ơn !
 
Upvote 0
Cho em hỏi
GetPermu "", Num
Range("A1").Resize(n - 1) = Arr
Có ý nghĩa là như nào vì hàm GetPermu không thấy có liên quan đến Arr ?
Cám ơn !

Nó đâu phải hàm. Nó là 1 Sub có tham số truyền. Arr được khai báo Public ở dòng đầu tiên, sau quá trình tính toán (Arr(n, 1) = x & y) thì Arr sẽ được tạo ra thôi
Mã:
Dim n As Long, [COLOR=#ff0000]Arr(1 To 362880, 1 To 1)[/COLOR]
Sub GetPermu(x As String, y As String)
  Dim i As Long, j As Long
  j = Len(y)
  If j < 2 Then
    [COLOR=#ff0000]Arr(n, 1) = x & y[/COLOR]
    n = n + 1
  Else
    For i = 1 To j
      GetPermu x & Mid(y, i, 1), Left(y, i - 1) & Right(y, j - i)
    Next
  End If
End Sub
Mấy chổ màu đỏ là chổ liên quan đấy
 
Upvote 0
Cám ơn thầy! Nhưng giờ nếu em muốn hoán vị các giá trị ở các ô cho nhau
Như file đính kèm
 

File đính kèm

  • Hoan vị.xls
    74.5 KB · Đọc: 58
Upvote 0
Cám ơn thầy! Nhưng giờ nếu em muốn hoán vị các giá trị ở các ô cho nhau
Như file đính kèm

Hoán vị 5 phần tử ta được 120 kiểu kết hợp. Vậy hỏi lại bạn: Kết quả sẽ đặt vào đâu và cách bố trí 120 kết quả ấy là thế nào
Bạn cho ví dụ vào file luôn cho tôi dễ hình dung
 
Upvote 0

File đính kèm

  • Hoan vị.xls
    80.5 KB · Đọc: 73
Upvote 0

Sửa lại Sub Main thế này nhé:
PHP:
Sub Main()
  Dim Num As String, tmp As String, sBin As String
  Dim lR As Long, lC As Long, lPos As Long, t As Double
  Dim aDec, aBin, aRet(1 To 120, 1 To 6)
  t = Timer
  Num = "12345"
  n = 1
  GetPermu "", Num
  aDec = Sheet2.Range("B2:F2").Value
  aBin = Sheet2.Range("B3:F3").Value
  For lR = 1 To 120
    tmp = Arr(lR, 1)
    sBin = ""
    For lC = 1 To 5
      lPos = CLng(Mid(tmp, lC, 1))
      aRet(lR, lC) = aDec(1, lPos)
      sBin = sBin & aBin(1, lPos)
    Next
    aRet(lR, 6) = "'" & sBin
  Next
  Sheet3.Range("A2").Resize(n - 1, 6) = aRet
  MsgBox "Thoi gian phat sinh: " & Round(Timer - t, 2) & " giay"
End Sub
Các Sub khác giữ nguyên (kể cả hàm của bạn)
 
Upvote 0
Cám ơn thầy rất nhiều :)
Em có thay đổi 1 chút xít là: Giờ em muốn ghi giá trị nhị phân của số hoán vị,mỗi số ra 1 ô ?
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn tăng dãy hoán vị, mà tăng tới 9 nó không chạy là bị sao ạ.
1599470066460.png
Như thế này thì được
1599470095239.png
Em muốn tăng thành dãy A=(1,2,3,4,5,6,7,8,9,10,11,12) hoán vị dãy này như thế nào ạ.​
Ai biết giúp em với ạ.​
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom