PDA

Ver la Versión Completa : Combinaciones Numero De 4 Cifras


rbarzallo
01-08-2012, 16:40:25
Buen dia Foro,

alguien me puede ayudar e indicar como puedo realizar en Delphi las combinaciones posibles de un numero de 4 cifras? es decir, a partir de un numero de 4 cifras previamente conocido.

Por ejemplo el 0027 o el 8012 y que no se repitan?

Agradeciendo de antemano su ayuda.

roman
01-08-2012, 17:25:29
¿Te refieres a las combinaciones de sus dígitos?

Toma cada uno de los dígitos y pégales las combinaciones de los tres restantes. Ahora tienes el mismo problema pero con menos dígitos, es decir, basta que resuelvas el problema para números de tres dígitos.

Para resolver este segundo problema, toma cada uno de los tres dígitos y pégales las combinaciones de los dos restantes. Ahora tienes el mismo problema pero con menos dígitos, es decir, basta que resuelvas el problema para números de dos dígitos.

Este tercer problema es trivial pues sólo hay dos combinaciones posibles para números de dos cifras, AB y BA.

Lo que estoy describiéndote es un proceso recursivo con el que puedes resolver el problema.

// Saludos

ecfisa
01-08-2012, 17:28:00
Hola rbarzallo.

Una forma de realizarlo: Declara cinco variables, una para almacenar los 4 dígitos y 4 mas para que recorran los cuatro números.

El algorímo se reduce a:

variables
n
a,b,c,d

comenzar

leer n. // leer los 4 dígitos

para a <- 1 hasta 4
...
...
...
si no((n[a]=n) [B]v (n[a]=n[c]) v (n[a]=n[d]) v
(n[b]=n[c]) v (n[b]=n[d]) v (n[c]=n[d])) entonces
escribir (n[a],n[b],n[c],n[d]).
...


Saludos.

Edito: No lo puse en Pascal para que realices algo de la tarea... :)

Casimiro Notevi
01-08-2012, 18:19:56
Edito: No lo puse en Pascal para que realices algo de la tarea... :)

Entre lo que ha explicado Román y el metacódigo que ha puesto ecfisa... ya casi tengo yo también mi programita de combinaciones.
Así sí que se aprende :)

roman
01-08-2012, 18:40:30
Yo, la verdad, no entendí el metacódigo :o (pero ya hice la tarea :))

// Saludos

ecfisa
01-08-2012, 19:50:58
Yo, la verdad, no entendí el metacódigo :o

Seguramente por que el pseudocódigo que iría en lugar de los '...' no queda tán claro de deducir como yo pensaba...:o

Sería:

variables
n
a,b,c,d

comenzar

leer n

para a <- 1 hasta 4
para b <- 1 hasta 4
para c <- 1 hasta 4
para d <- 1 hasta 4
si no((n[a]=n) [B]v (n[a]=n[c]) v (n[a]=n[d]) v (*)
(n[b]=n[c]) v (n[b]=n[d]) v (n[c]=n[d])) entonces
escribir (n[a],n,n[c],n[d]).
[B]fin

(*) v = disyunción inclusiva

Saludos. :)

Casimiro Notevi
01-08-2012, 20:34:43
jejeje... puse metadato, lo corregí a medias y se quedó en metacódigo :)

Casimiro Notevi
01-08-2012, 20:37:10
Seguramente por que el pseudocódigo que iría en lugar de los '...' no queda tán claro de deducir como yo pensaba...

A ver si lo que está preguntando es otra cosa, porque todavía no ha dicho nada.

roman
01-08-2012, 20:44:48
Quizá dejó el ejercicio y se fue a la escuela.

// Saludos

ecfisa
01-08-2012, 20:45:58
A ver si lo que está preguntando es otra cosa, porque todavía no ha dicho nada.
Puede ser, pero me parece que es eso... realmente estuve amarrete con el primer código :o

Saludos. :)

roman
01-08-2012, 20:55:20
Bueno, mi solución tiene un error que ahora veo. La puse pensando en que las cifras del número no se repetían, pero si eso pasa debo descartar las repeticiones.

// Saludos

rbarzallo
02-08-2012, 00:09:38
ok, gracias por su ayuda.

Exactamente lo que necesito realizar es obtener las combinaciones de 4 digitos conocidos, pero de forma aleatoria.

Es decir, si tengo el numero 1963, obtener 6 combinaciones de dicho numero es decir, 1963, 1936, 1396, 1369, 1693, 1639

Gracias

Casimiro Notevi
02-08-2012, 00:18:33
No entiendo lo de "forma aleatoria" :confused:
Además tampoco entiendo lo de 6 combinaciones, ¿el 1 no cuenta?

ecfisa
02-08-2012, 01:29:31
ok, gracias por su ayuda.

Exactamente lo que necesito realizar es obtener las combinaciones de 4 digitos conocidos, pero de forma aleatoria.

Es decir, si tengo el numero 1963, obtener 6 combinaciones de dicho numero es decir, 1963, 1936, 1396, 1369, 1693, 1639

Gracias
Hola rbarzallo.

Se puede hablar de combinatoria cuando los grupos obtenidos se consideran diferentes si y solo sí, tienen un elemento diferente, por lo que en este caso estaríamos hablando de permutación. Es decir, se considera que un grupo es diferente a otro cuando difiere en el órden en que están dispuestos los elementos.

El número 1963 consta de cuatro dígitos y como es tomado de 4 en 4, sin ahondar en detalles, podemos decir que el número total de grupos a formar es 4! = 4.3.2.1 = 24

Los grupos obtenidos son:

1369 3169 6139 9136
1396 3196 6193 9163
1639 3619 6319 9316
1693 3691 6391 9361
1936 3916 6913 9613
1963 3961 6931 9631

Y aunque tal vez haya una mejor forma, es lo que realiza el pseudocódigo del mensaje #6 (http://www.clubdelphi.com/foros/showpost.php?p=438629&postcount=6) de este hilo.

Saludos. :)

rbarzallo
02-08-2012, 01:44:16
Correcto eficsa, eso es exactamente lo que estoy necesitando desarrollar en Delphi.

Saludos

AzidRain
02-08-2012, 01:47:21
Estaba pensando en las combinaciones y permutaciones, el famoso factorial (!) y mis clases de Mate IV en la Uni. La solución de eficsa es la correcta y además la más sencilla. Me acorde de una materia que se llamaba "Análisis Numérico" y que precisamente se trataba de resolver problemas matemáticos como este (hasta "Furias" de Fourier y "Transtornadas" de La Place) pero con la ayuda del lenguaje computacional de tu gusto. Era fenomenal esa clase.

roman
02-08-2012, 17:31:11
El número 1963 consta de cuatro dígitos y como es tomado de 4 en 4, sin ahondar en detalles, podemos decir que el número total de grupos a formar es 4! = 4.3.2.1 = 24


Claro, pero el problema es cuando el número tiene cifras repetidas, como en el ejemplo que dio al principio: 0027, porque entonces hay aparecen combinaciones repetidas.

// Saludos

ecfisa
02-08-2012, 23:24:57
Claro, pero el problema es cuando el número tiene cifras repetidas, como en el ejemplo que dio al principio: 0027, porque entonces hay aparecen combinaciones repetidas.

// Saludos
Hola roman.

Estuve pensando en lo que comentas y no sé si estare hacertado conceptualmente, pero pienso que aún usando permutación con repetición, se debería consider la posición que ocupa el elemento en los grupos y no su valor. Si bién 0 y 0 tienen el mismo valor, no se refieren al mismo elemento.

Claro que tomando en cuenta lo anterior y con el condicional:

if not((a=b)or(a=c)or(a=d)or(b=c)or(b=d)or(c=d)) then // tampoco serviría evaluar el valor (n[a]=n[b])...
writeln(n[a],n[b],n[c],n[d]);

las repeticiones son inevitables.

Pero como te dije mas arriba, no estoy totalmente seguro cuál es el concepto que debiera considerarse, si el valor o el elemento... :confused:

Saludos.

roman
02-08-2012, 23:33:00
Entiendo lo que dices, pero eso ya tendrá que contestarlo el profesor.

// Saludos