Det er rigtigt, der er 15.120 kombinations muligheder, de fleste vil dog være ens!! Uden at skulle gå for meget i detaljer med matematiken ovenstående kunne betragtes som et binært tal som maksimalt kan være 2^9-1 = 511 ud af disse opfylder 126 din betingelse. Men til koden:
Sub Permut5Bit() Dim s As String Dim i As Long Dim Bits As Byte Bits = 9 For i = 1 To 2 ^ Bits s = Deci2Bin(i, Bits) If CountBit(s) = 5 Then Debug.Print s Next End Sub
Function Deci2Bin(ByVal i As Integer, l As Byte) As String Dim j As Byte For j = 1 To l If i Mod 2 > 0 Then s = "1" & s Else s = "0" & s End If i = Int(i / 2) Next j Deci2Bin = s End Function
Function CountBit(s As String) As Byte Dim j, c As Byte For j = 1 To Len(s) c = c + CInt(Mid(s, j, 1)) Next j CountBit = c End Function
Men på dette udtryk (100101011) kan du ikke se forskel på om det er det første ettal der står på plads nr. 1, 4, 6, 8 eller 9, hvorfor du skal dividere dit resultat med antallet af kombinations muligheder de 5 ettaller kan stå på, hvilket er 5*4*3*2*1 = 120 => 15120/120 = 126 !! QED :-D
Det kan ikke helt få til at fungere. Strengen skal altid indeholde 9 karakterer. Jeg brugte: If CountBit(s) = 5 Then Debug.Print s ActiveSheet.Cells(i, 1) = s
Sorry, vi prøver lige igen. Behold de to funktioner, og erstat Permut5Bit med denne:
Sub Permut5Bit() Dim s As String Dim i, j As Long Dim Bits As Byte Bits = 9 j = 2 For i = 1 To 2 ^ Bits s = Deci2Bin(i, Bits) If CountBit(s) = 5 Then Cells(j, 1) = s Cells(j, 1).NumberFormat = "000000000" j = j + 1 End If Next End Sub
Fandt selv ud af det, da jeg formaterede kolonnen til tekst :-)
Da jeg derefter tog tværsummen i kolonne B og lavede et filter og fik frasorteret alle dem forskellig fra 5 var der 126 tilbage.
Tak for hjælpen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.