Ejercicio básico de combinaciones

(1/8) > >>

luis456:
Hola a Todos
Tengo algún tiempo sin programar y se me ha olvidado algunas cosas ya muchos me conocéis, como siempre he trabajado sobre la base de dos dígitos, ahora se me ocurre hacerlo con 6 0 8 números y que me haga las combinaciones del 01 al 49 y si claro es para loterías jejej .bien mi idea es la siguiente :

introduzco seis números  ejemplo  1, 4, 5, 7, 8, 9  y que con estos números se me formen resultados de 6 números :

14 15 17 18 19
41 45 47 48 49

como vemos la condición es que no se formen números mayores a 49

Encontre este codigo dentro de mis archivos pero creo es de excel y quiero convertirlo a Net

Código
Sub Combinacion()
i = 1
For b1 = 1 To 61
   For b2 = b1 + 1 To 62
       For b3 = b2 + 1 To 63
           For b4 = b3 + 1 To 64
           Cells(i, 1) = b1
           Cells(i, 2) = b2
           Cells(i, 3) = b3
           Cells(i, 4) = b4
           Range("E1") = i
           i = i + 1
           Next
       Next
   Next
Next
End Sub


A ver quien le echa una mano a este VIEJO jejej y espero para este septiembre 14 me feliciten por mis 61 años 😨

Luis







K-YreX:
Yo diría que algo así te puede servir:
Código
int numeroMaximo = 49;
int[] digitos = { 1, 4, 5, 7, 8, 9 };
List<int> numerosGenerados = new List<int>();
 
int decenaMaxima = numeroMaximo / 10;
int unidadMaxima = numeroMaximo % 10;
 
for(int i = 0; i < digitos.Length && digitos[i] <= decenaMaxima; ++i)
 for(int j = 0; j < digitos.Length && (digitos[i] < decenaMaxima || digitos[j] <= unidadMaxima); ++j)
   numerosGenerados.Add(digitos[i] * 10 + digitos[j]);
** Para que el algoritmo anterior funcione correctamente el array de dígitos debe estar ordenado.
Las condiciones de los bucles for() no son muy complicadas pero cualquier duda no dudes en comentarla.

Serapis:
Como lo que quieres es guardar la distancia entre los números y tales repartirlos entre el conjunto limitado del rango 1-49, es adecuado que primero se busque el mayor de la serie, así sabes que el límite mayor será: 49 - valormayor. (el array no necesita estar ordenado).

El limite inferior es 1, luego con un bucle puedes recorrer todas las combinaciones posibles... y con otro dentro formar los valores de cada combinación, sumando el ciclo actual a cada uno de los valores del array recibido...

Código:

funcion Combinaciones(array de bytes nums())
    byte j, k, max
    string combinacion

    max = (49 - MayorEn(nums))
    bucle para j desde 1 hasta max)
        Si (j= nums(0)) imprimir  "Esta es la combinacion recibida."

        bucle para k desde 0 hasta nums.length -1                    
            combinacion = (combinacion & (nums(k) + j).tostring)
        siguiente

        imprimir j.tostring, combinacion
        combinacion = ""
    siguiente

    imprimir "Con estos valores, pudieron formarse " & j.tostring & " combinaciones distintas.
fin funcion

byte = funcion MayorEn(array de bytes valores())
    entero k
    byte j = valores(0)  

    bucle para k desde 1 hasta valores.length-1
        si (valores(k) > j)
            j = valores(k)
        fin si
    siguiente
    
    devolver j
fin funcion




p.d.: Viendo que no eres capaz de pasar ese simple código a NET, me parece que quizás tampoco seas capaz de pasar este pseudocódigo, así que te lo he pasado yo mismo y te muestro una simple captura de la interfaz...


La interfaz es muy simple, un textbox, un boton y un listbox para recoger la lista...
Cuando pulsas el botón trata de crear el array con los valores (no verifica si están en el rango 1-49, pero si no es siquierra un byte 'cantará error'... en fin se supone que la se usará a sabiendas de los valores que vas a introducir, luego huelga hacer una comprobación, si comprueba que al menos haya 6 valores (ese despite si es fácil que ocurra)... Por lo mismo que antes, tampoco verifica que no haya numeros repetidos...

Luego se invoca una función que vacía a la lista y la rellena con todas las combinaciones posibles... cuando mayor sea el valor mayor de la serie, tantas menos combinaciones habrá. Nota que la serie no precisa estar ordenada, NEt dispone de su propios métodos para hallar el valor mayor en un array, lo que nos evita escribir una función...

Y aquí el código...
Código
Imports System.Text
 
Public Class Form1
 
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim Nums() As String, txt As String
       Dim Valores() As Byte, k As UInt16
 
       txt = TextBox1.Text.Replace(" ", "")
       Nums = txt.Split(",")
       If (Nums.Length = 6) Then
           ReDim Valores(0 To 5)
           For k = 0 To 5
               Valores(k) = System.Byte.Parse(Nums(k))
           Next
           Call Combinaciones(Valores)
       Else
           MessageBox.Show("No, no no... Debe haber 6 y solo 6 numeros, separados por 1 coma...")
       End If
   End Sub
 
   Private Sub Combinaciones(ByVal Valores As Byte())
       Dim j, k, max As Byte
       Dim combinacion As String = ""
 
       ListBox1.Items.Clear()
       max = (49 - Valores.Max)
       For j = 0 To max
           For k = 0 To 5
               combinacion &= ((Valores(k) + j).ToString) & ", "
           Next
 
           ListBox1.Items.Add(combinacion)
           combinacion = ""
       Next
   End Sub
End Class
 

luis456:
 ;-) ;-) ;-) ;-) ;-)
Gracias de verdad gracias a todos aunque todavía no he probado ninguno de vuestros códigos (no he podido ya que estoy en otro PC ) y no tengo instalado el Visual Net y por ser esclavo (digo que tengo que trabajar ;( ) no he tenido tiempo de probar pero ya lo hare y de verdad que estoy super agradecido con todos

saludos
Luis

luis456:
Hola a todos de nuevo al ataque jjejej

Por fin instale de nuevo el Visual y he podido probar el código de Serapis

Codigo

Código
Imports System.Text
 
Public Class Form1
 
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim Nums() As String, txt As String
       Dim Valores() As Byte, k As UInt16
 
       txt = TextBox1.Text.Replace(" ", "")
       Nums = txt.Split(",")
       If (Nums.Length = 6) Then
           ReDim Valores(0 To 5)
           For k = 0 To 5
               Valores(k) = System.Byte.Parse(Nums(k))
           Next
           Call Combinaciones(Valores)
       Else
           MessageBox.Show("No, no no... Debe haber 6 y solo 6 numeros, separados por 1 coma...")
       End If
   End Sub
 
   Private Sub Combinaciones(ByVal Valores As Byte())
       Dim j, k, max As Byte
       Dim combinacion As String = ""
 
       ListBox1.Items.Clear()
       max = (49 - Valores.Max)
       For j = 0 To max
           For k = 0 To 5
               combinacion &= ((Valores(k) + j).ToString) & ", "
           Next
 
           ListBox1.Items.Add(combinacion)
           combinacion = ""
       Next
   End Sub
End Class

Bueno funciona bien dentro lo que cabe pero no hace lo que que quiero al 100 % ya que me hace combinaciones con números que no están dentro de los que introduzco:

Ejemplo

si introduzco  2 , 3 , 5 , 7 , 8 , 9

primero los números que se deben formar son  23 25 27 28 29 después 32 35  37 38 39  y con estos números hacer las combinaciones ya que como vemos no hay  0, 4, 1  en este caso serian 12 números a combinar formando combinaciones de 6 que cumplan la condición mirar (bonoloto primitiva) Si nos hacemos ricos lo haremos entre todos jejejje


NOTA (no se como ostias subir una captura de pantalla )


Saludos  todos
Luis






 

Navegación

[0] Índice de Mensajes

[#] Página Siguiente