chỉnh hợp 5 số! (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

nguyễn tiến đạt 9999

Thành viên mới
Tham gia
21/3/20
Bài viết
2
Được thích
0
các bác giúp em với. Em muốn nhập vào số có 5 chữ số. Sau đó muốn liệt kê các giá trị chỉnh hợp của 5 số đó. Ví dụ: input là 12 thì sẽ có kết quả là 12 và 21.
input 123 : 123 - 132 - 213 - 231 -312 - 321. Tương tự như vậy với 5 chữ số.
Em mù công nghệ, nên bác nào làm hộ em cái file excel được không ạ?
Em cảm ơn nhiều ạ!
 
Theo thí dụ thì là hoán vị, không phải chỉnh hợp. Ngoài ra đâu là "input" là "số có 5 chữ số"?
 
Cái này gọi là permutation. Ở diễn đàn này đã có vài bài thực hiện.
Muốn đồ mới thì tìm trên mạng các thuật toán. Theo tôi thuật toán dễ nhất là heap permutation.
Thường thì nó ở dạng code C++, Java, hoặc Python.
Nếun không hiểu nỏi thì copy code ấy lên đây. Hy vọng sẽ có ngừoi dịch ra giùm cho.

Cái này là trình độ cao của toán ứng dụng và bậc cao của công nghệ thông tin. Nếu nói chuyện "mù công nghệ" thì tốt hơn hết là đừng rớ vào. Không biết lái xe hơi thì đừng nghĩ đến lái trực thăng.
 
Nếu chỉ là hoán vị của các chữ số từ 1 đến 9 thì cũng không cần kiến thức gì ghê gớm. Hàm HoanVi(n) sẽ liệt kê các số có n chữ số khác nhau từ 1 đến n (1<=n<=9), chạy với n=9 mất khoảng 1 - 2 giây.
Mã:
Option Explicit
Option Base 1

Function HoanVi(n As Long)
    Dim i As Long, k As Long, m As Long, SoPhanTu As Long, HV(), KQ()
    If n = 1 Then
        HoanVi = 1
        Exit Function
    End If
    If n = 2 Then
        HoanVi = Array(21, 12)
        Exit Function
    End If
    HV = HoanVi(n - 1)
    SoPhanTu = UBound(HV)
    ReDim KQ(1 To n * SoPhanTu)
    m = 1
    For k = 1 To SoPhanTu
        For i = 0 To n - 1
            KQ(m) = Left(HV(k), i) & n & Right(HV(k), n - 1 - i)
            m = m + 1
        Next
    Next
    HoanVi = KQ
End Function

Sub test()
    Dim arr, n&
    n = 9
    arr = HoanVi(n)
    If n > 1 Then
        Range("A1").Resize(UBound(arr)) = Application.Transpose(arr)
    Else
        Range("A1") = arr
    End If
End Sub
 
Lần chỉnh sửa cuối:
Tổng số pờ-mu là n!
Với 9 chữ số, con số kết quả là 362880
Máy bạn chạy êm thiệt.
Mà tôi nhớ Transpose chỉ chạy tới 65000 dòng thôi (cũng có thể tôi nhớ lầm).
 
Tổng số pờ-mu là n!
Với 9 chữ số, con số kết quả là 362880
Máy bạn chạy êm thiệt.
Mà tôi nhớ Transpose chỉ chạy tới 65000 dòng thôi (cũng có thể tôi nhớ lầm).
Đúng là em không để ý, phần cuối của mảng bị cắt cụt, sửa lại Sub test() để đổ ra sheet cũng khá lâu nhưng vẫn chấp nhận được, khoảng 30s với n=9, vì vậy không cần phải đọc từng phần của mảng 1 chiều vào mảng 2 chiều để đổ xuống sheet.
Mã:
Sub test()
    Dim arr(), i&, m&, n&
    n = 9
    If n = 1 Then Range("A1") = HoanVi(1): Exit Sub
    Application.ScreenUpdating = False
    arr = HoanVi(n)
    m = UBound(arr)
    For i = 1 To m
        Range("A" & i) = arr(i)
    Next
    Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Đúng là em không để ý, phần cuối của mảng bị cắt cụt, sửa lại Sub test() để đổ ra sheet cũng khá lâu nhưng vẫn chấp nhận được, khoảng 30s với n=9, vì vậy không cần phải đọc từng phần của mảng 1 chiều vào mảng 2 chiều để đổ xuống sheet.
Trời ạ, không ai làm như thế. Có 362 880 kết quả mà bạn nhập từng ô trên sheet? Trên máy cà tàng của tôi là ~ 300 s.

Sửa nhẹ như sau
Mã:
Sub test()
    Dim arr(), i&, n&, result(), t
    t = Timer
    n = 9
    If n = 1 Then Range("A1") = HoanVi(1): Exit Sub
    Application.ScreenUpdating = False
    arr = HoanVi(n)
    ReDim result(1 To UBound(arr), 1 To 1)
    For i = 1 To UBound(arr)
        result(i, 1) = arr(i)
    Next
    Range("A1").Resize(UBound(result)).Value = result
    Application.ScreenUpdating = True
    MsgBox Timer - t
End Sub
 
Xin mời. Máy 19 tuổi. Khi mua RAM 512 MB, sau lắp thêm 1 thanh 512 MB. Đồng hồ lúc mua cũng một nửa.

View attachment 235414
Đoán là máy này do bác gái mua tặng, 20 năm trước cháu vẫn còn "show" cậu nhỏ cho mọi người xem nhóe.
Bài đã được tự động gộp:

Đồng hồ lúc mua cũng một nửa.
KHông hiểu cái đoạn này luôn.
 
Tôi cũng là dân nhận máy thải của thiên hạ. Hiện giờ tôi có

Hàng không xài nữa:
- 1 cái Lenovo lép tốp, Win XP. Yếu quá, không buồn nhớ tới nó.
- 1 cái Toshiba lép tốp Win XP. Cái này tương đối là ngon ở thời của nó. Sau này tôi đổi qua Linux nhưng hàng Toshiba này khó kiếm drivers quá nên chịu thua.
- 1 cái Toshiba lép tốp touch screen Win Vista. Cái này hình như là hàng 'flop', chạy như hạch. Chịu thua, bỏ luôn.
- 1 cái Sony lép tốp core 7 đời thứ nhất. Chạy nóng quá cháy luôn. Cái này nếu thay mạch thì xài được nhưng lười quá.
- 1 cái đét tốp Win 7. Cũ quá, dẹp. Lười gắn Linux.
- 1 cái Macbook pro, cũ rích, upgrade lên đến El Capitan thì hết chạy nổi.
- 1 cái Asus lép tốp Win10. Tương đối được, nhưng đã có thằng Sony (xem ở dưới) rồi nên đang tìm cách Linux nó.

Hàng đang xài:
- 1 cái đét tốp cũng cũ rích, Win 7. 4G Ram, tính ugrade lên 16G nhưng không xứng với tiền bỏ ra. Đang đợi có đưa schaus nào thải hàng thì chôm Ram.
- 1 cái Sony lép tốp touch screen, Win10. Cái này được nhưng bị tội cục pin hơi nhỏ, chạy một chút thì hết pin.
- 1 cái Macbook Air cũ, chỉ upgrade lên đến High Sierra là ì ạch rồi. Nó chính là cái tôi đang dùng để gõ bài này.
(có thằng cháu vừa thải ra cái Dell cực chiến, giơ tay không kịp bị một thằng cậu của nó, tức em tôi, giành trước. Tức vỡ mật)
 
Đoán là máy này do bác gái mua tặng,
Gần đúng. Vợ mua nhưng không hẳn là tặng. Hồi đó 2 vợ chồng có máy cà tàng mua năm 1997. Tôi thì chả làm phim, đồ họa, game, mà chỉ ngồi trên diễn đàn Delphi nên không cần máy cấu hình mạnh. Vợ không chịu được, dù cũng chỉ dùng viết lách, thế là vợ mua máy mới. Sau một thời gian vợ mua cho mình laptop, cũng đổi mấy lần. Còn tôi dùng máy bàn và chả có nhu cầu thay đổi nên vẫn dùng máy cà tàng. :D
 
Tôi cũng là dân nhận máy thải của thiên hạ. Hiện giờ tôi có
Thế thì bác cũng chịu xài. Tôi nếu không có nhu cầu thì không đổi. Đời tôi cũng chỉ mới dùng Windows 95, 98, rồi sau là XP. Sau đó có người thải notebook nên năm 2018 tôi cài Windows 8 với office 2013. XP Home cài office 2010. Vợ có laptop cài Windows 10, tôi cài thêm office 2007.
 
Kỳ này tính xin sư phụ Vẹt nhỏ một con máy về sài, cháu qua hai đời máy bàn, chưa sài laptop. Con máy đầu ram 1gb, win xp, cài máy ảo để vọc chạy chảy nước mắt, sau nâng ram 3gb chạy được khoảng mấy tháng thì em nó ra đi. Mang đi sửa, thợ bảo không chữa được do hỏng main. Thời gian dùng tổng là khoảng 7năm. Con máy hiện tại cấu hình nhỉnh hơn chút, sài win 7 ( bỏ qua vista), hôm trước tính lên win 10 cho sang chảnh. Xong sợ chậm thế là vãnn win 7.
Bài đã được tự động gộp:

Thi thoảng tự nhủ sài máy yếu, chứ máy nhanh mình phải chạy theo nó, rồi lại mệt ra.
 
Tôi cũng là dân nhận máy thải của thiên hạ. Hiện giờ tôi có

Hàng không xài nữa:
- 1 cái Lenovo lép tốp, Win XP. Yếu quá, không buồn nhớ tới nó.
- 1 cái Toshiba lép tốp Win XP. Cái này tương đối là ngon ở thời của nó. Sau này tôi đổi qua Linux nhưng hàng Toshiba này khó kiếm drivers quá nên chịu thua.
- 1 cái Toshiba lép tốp touch screen Win Vista. Cái này hình như là hàng 'flop', chạy như hạch. Chịu thua, bỏ luôn.
- 1 cái Sony lép tốp core 7 đời thứ nhất. Chạy nóng quá cháy luôn. Cái này nếu thay mạch thì xài được nhưng lười quá.
- 1 cái đét tốp Win 7. Cũ quá, dẹp. Lười gắn Linux.
- 1 cái Macbook pro, cũ rích, upgrade lên đến El Capitan thì hết chạy nổi.
- 1 cái Asus lép tốp Win10. Tương đối được, nhưng đã có thằng Sony (xem ở dưới) rồi nên đang tìm cách Linux nó.

Hàng đang xài:
- 1 cái đét tốp cũng cũ rích, Win 7. 4G Ram, tính ugrade lên 16G nhưng không xứng với tiền bỏ ra. Đang đợi có đưa schaus nào thải hàng thì chôm Ram.
- 1 cái Sony lép tốp touch screen, Win10. Cái này được nhưng bị tội cục pin hơi nhỏ, chạy một chút thì hết pin.
- 1 cái Macbook Air cũ, chỉ upgrade lên đến High Sierra là ì ạch rồi. Nó chính là cái tôi đang dùng để gõ bài này.
(có thằng cháu vừa thải ra cái Dell cực chiến, giơ tay không kịp bị một thằng cậu của nó, tức em tôi, giành trước. Tức vỡ mật)
Bác có cái nào không dùng gửi tặng cho em dùng với. Em cảm ơn Bác nhiều!
 
Web KT

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

Back
Top Bottom