Jump to content

csn para combinatorio


Souto

Recommended Posts

Deixo aqui minha contribuição para o forum

csn para combinatorio .

Na aba desenvolvedor: inserir novo modulo

colar a função

em a1 colocar numeros de 1 a 3.268.760

clicar em a2 e selecionar de b2:p2>escrever csnparacombinacao=a1>apertar ctrl+shift+enter

Function CSNparaCOMBINACAO(seq As Long) As Variant
Dim CSN, N, k As Integer
Dim combinacao(0 To 14) As Variant
Dim TXT As String

CSN = seq
 N = 25
 k = 15
    LIMITE_INFERIOR = 0
    R = 0   
    For i = 0 To (k - 1)
    combinacao(i) = i
    Next i   
    For i = 0 To k - 2
    'Debug.Print i
        'LIMITE_INFERIOR = 0
        'R = 0
        If combinacao(i) > 0 Then
        combinacao(i) = combinacao(i - 1)
        End If
                Do While LIMITE_INFERIOR < CSN
                'Debug.Print combinacao(i)
                    combinacao(i) = combinacao(i) + 1
                    
                    R = Application.WorksheetFunction.Combin(N - combinacao(i), (k - 1) - i)
                    
                    LIMITE_INFERIOR = LIMITE_INFERIOR + R
                    'Debug.Print r
                   ' Debug.Print limite_inferior
                Loop      
     LIMITE_INFERIOR = LIMITE_INFERIOR - R    
    Next i  
    combinacao(k - 1) = combinacao(k - 2) + CSN - LIMITE_INFERIOR
    
       ' TXT = combinacao(0)
    'For i = 1 To 14
        'TXT = TXT & " " & combinacao(i)
    'Next i
    'CSNparaCOMBINACAO = TXT
    
    CSNparaCOMBINACAO = combinacao
End Function

 

  • Like 3
  • Thanks 1
Link to comment
Share on other sites

2 horas atrás, Souto disse:

Deixo aqui minha contribuição para o forum

csn para combinatorio .

Na aba desenvolvedor: inserir novo modulo

colar a função

em a1 colocar numeros de 1 a 3.268.760

clicar em a2 e selecionar de b2:p2>escrever csnparacombinacao=a1>apertar ctrl+shift+enter

Function CSNparaCOMBINACAO(seq As Long) As Variant
Dim CSN, N, k As Integer
Dim combinacao(0 To 14) As Variant
Dim TXT As String

CSN = seq
 N = 25
 k = 15
    LIMITE_INFERIOR = 0
    R = 0   
    For i = 0 To (k - 1)
    combinacao(i) = i
    Next i   
    For i = 0 To k - 2
    'Debug.Print i
        'LIMITE_INFERIOR = 0
        'R = 0
        If combinacao(i) > 0 Then
        combinacao(i) = combinacao(i - 1)
        End If
                Do While LIMITE_INFERIOR < CSN
                'Debug.Print combinacao(i)
                    combinacao(i) = combinacao(i) + 1
                    
                    R = Application.WorksheetFunction.Combin(N - combinacao(i), (k - 1) - i)
                    
                    LIMITE_INFERIOR = LIMITE_INFERIOR + R
                    'Debug.Print r
                   ' Debug.Print limite_inferior
                Loop      
     LIMITE_INFERIOR = LIMITE_INFERIOR - R    
    Next i  
    combinacao(k - 1) = combinacao(k - 2) + CSN - LIMITE_INFERIOR
    
       ' TXT = combinacao(0)
    'For i = 1 To 14
        'TXT = TXT & " " & combinacao(i)
    'Next i
    'CSNparaCOMBINACAO = TXT
    
    CSNparaCOMBINACAO = combinacao
End Function

 

Deveria ter colocado o código dentro de uma caixa de código. Junto com esta postagem tem uma imagem mostrando onde fica na caixa de edição de postagem para por um código.

 

Depois de colocar dentro de uma caixa de código, o código ficará mais ou menos assim: postagem com código

 

Por quê postar um código dentro de uma caixa de código? Simples. Existe alguns caracteres que são tratados como entidades HTML e não são exibidos corretamente quando não estão em uma caixa de código. Além disso, há algumas linguagens de programação que a indentação errada pode custar a execução do código, como exemplo: python, nim, etc. e um código fora da caixa de código perde a indentação.

 

Portanto, sempre coloque um código dentro de uma caixa de código.

 

Abraço!

exemplo_como_por_codigo.png

  • Like 2
  • Thanks 1
Link to comment
Share on other sites

RESPOSTA PARA, PARAFUSO, LOTOMANIA...
ESPERO QUE TENHA ENTENDIDO...
FONTE DO ALGORITMO 3W.DREAMsinCODE.COM; O algoritmo para calcular a combinação a partir do CSN é uma engenhosa obra prima de B. P. Buckles e M. Lyabanon, publicada em 1974. MODIFICADO POR SOUTO PARA RODAR NO EXCEL

NA ABA DESENVOLVEDOR EXCEL> INSERIR NOVO MODULO >COPIAR E COLAR A FUNCTION ABAIXO
IR PARA PLAN1 > A1=CSN DESEJADO (1 A COMBIN(100;50))
SELECIONAR AS PROXIMAS 50 COLUNAS E ESCREVER "=CSNparaCOMBINACAOlotomania=A1" + "CTRL+SHIFT+ENTER" <FORMULA MATRICIAL>
  
  Function CSNparaCOMBINACAOlotomania(seq As Long) As Variant
Dim CSN As Long
Dim N, k As Integer
Dim combinacao(0 To 49) As Variant

CSN = seq
 N = 100
 k = 50
    LIMITE_INFERIOR = 0
    R = 0
    
    For i = 0 To (k - 1)
    combinacao(i) = i
    Next i
    
    For i = 0 To k - 2
        If combinacao(i) > 0 Then
        combinacao(i) = combinacao(i - 1)
        End If
                Do While LIMITE_INFERIOR < CSN
                
                    combinacao(i) = combinacao(i) + 1
                    
                    R = Application.WorksheetFunction.Combin(N - combinacao(i), (k - 1) - i)
                    
                    LIMITE_INFERIOR = LIMITE_INFERIOR + R
                    
                Loop
     LIMITE_INFERIOR = LIMITE_INFERIOR - R
    Next i
    
    combinacao(k - 1) = combinacao(k - 2) + CSN - LIMITE_INFERIOR
         
    CSNparaCOMBINACAOlotomania = combinacao
                                              
End Function
                                              

 

  • Like 2
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...