| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
bosterito
Registrado: 02 Mar 2006 Mensajes: 24
| Publicado: 28/09/2007 9:22 am | | | Título: numero vampiro |
| | alguien sabe como hacer un programa con lo numeros vampiros? para q me diga si un numero es o no vampiro |
| | Volver arriba | |  | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 91
| Publicado: 28/09/2007 12:35 pm | | | Título: |
| oh, bonito problema, sabes alguna propiedad más de los números vampiros. Así quizá te podría ayudar.
De momento estoy buscando más propiedades de estos números. |
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 388 Ubicación: Cono Sur
| Publicado: 28/09/2007 1:50 pm | | | Título: |
| La verdad es que eso de "números vampiros" no lo sabía. Ni la Wikipedia los ha visto nunca. Deben ser números que se chupan la sangre de otro...
Es por eso que me di una vuelta por los montes de transilvania para saber de esta criatura numeral, y un lugareño me dió la información:
Número vampiro: todo número natural para el cual exista una factorización formada por lo dígitos del propio número. Por ejemplo, el número 126 es un número vampiro ya que lo podemos factorizar así: 126=21·6.
Un saludo  |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3853 Ubicación: Mexico
| Publicado: 28/09/2007 3:54 pm | | | Título: |
| Como reto en C o C++ suena interesante, para empezar habria que desarrollar la solucion mas sencilla (fuerza bruta).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | Karman
Registrado: 15 Oct 2005 Mensajes: 313
| Publicado: 28/09/2007 6:06 pm | | | Título: |
| nos en la facultad nos habían dado a resolver un ejercisio como ese, pero con la diferencia que se tenía que utilizar todos los dígitios...
nnn=n*n*n
no recuerdo ejemplos ahora... pero esa era la idea... y si... lo habíamos resuelto por fuerza bruta... je
S2 _________________ www.inexinferis.co.nr
-. Karman .- |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 120 Ubicación: Argentina
| Publicado: 28/09/2007 8:01 pm | | | Título: Colaboración |
| En éste sitio muestra éste código en C Saludos. |
| | Volver arriba | |  | | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 91
| Publicado: 30/09/2007 2:08 pm | | | Título: |
| Bueno, aquí tengo mi primera idea, a ver si la consigo optimizar.
Lo que hace basicamente el programa escaneando los numeros del 2 al 1000000 y los va dividiendo por numero del 2 hasta la raiz del numero escaneado(no hace falta más).
encontrar un número divisible por él numero escaneado y que cumpla las condiciones de número vampiro. Ya lo explicaré mejor si eso. Pero ahora me iré a dormir.
| Código: | /*editado para optimizar el programa*/
#include<stdio.h>
#define CIFRAS 6 #define TOPE 1000000 //10^6
char digito(int numero, int posicion) { int indice; for(indice=0 ; indice<posicion ; indice++) numero/=10; return numero%=10; } int criba(int numero,int factor1,int factor2) { int numero_digitos=0,factor1_digitos=0,factor2_digitos=0; int indice,indice1,indice2; char comprovacion[CIFRAS]; for(indice=0;indice<CIFRAS;indice++) comprovacion[indice]=0; for(indice=numero; indice!=0 ; indice/=10) numero_digitos++; for(indice1=factor1; indice1!=0 ; indice1/=10) factor1_digitos++; for(indice2=factor2; indice2!=0 ; indice2/=10) factor2_digitos++; if(factor1_digitos+factor2_digitos!=numero_digitos) return 0; for(indice1=0; indice1<factor1_digitos; indice1++) { for(indice=0; indice<numero_digitos; indice++) { if(digito(numero,indice)==digito(factor1,indice1)&&comprovacion[indice]==0) { comprovacion[indice]=1; break; } } } for(indice2=0; indice2<factor2_digitos; indice2++) { for(indice=0; indice<numero_digitos; indice++) { if(digito(numero,indice)==digito(factor2,indice2)&&comprovacion[indice]==0) { comprovacion[indice]=1; break; } } } for(indice=0; indice<numero_digitos ; indice++) if(comprovacion[indice]==0) return 0; return 1; }
int main(void) { int numero,factor,indice,contador=0; for(numero=2; numero<TOPE ; numero++) { for(factor=2 ; factor*factor<numero ; factor++) { if(numero%factor==0 && criba(numero,factor,numero/factor)>0) { contador++; printf("%d=%d*%d\n",numero,factor,numero/factor); } } } return 0;
} |
Buenas noches!
Ultima edición por Pantalàimon_ el 02/10/2007 10:38 am; editado 2 veces |
| | Volver arriba | |  | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 91
| Publicado: 01/10/2007 12:37 pm | | | Título: |
| Bueno, pues ahora que tengo un poco más de tiempo lo explico.
El código está compuesto de tres funciones: Una sencilla que es char digito(int numero,int posicion) que más que nada me ayuda a tener una escritura más sencilla: entras un numero entero y una posición (0 para las unidades, 1 para las decenas, etc...) y te devuelve una cifra entre el 0 y el 9 correspondiente a la posición que le indicas.
Después está la función char criba(int numero,int factor1,int factor2) que se encarga de determinar si numero es vampiro de factor1 y factor2 devolviendo un 1 si es vampiro y un 0 si no lo es. Para eso descarta primero los numeros que no tienen el mismo numero de cifras que la suma de cifras de los factores. Una vez aquí mediante el vector comprovacion[] determinará si numero es vampiro o no. si comprovacion[] es {1,1,1,1,1,1} será un número vampiro, sino no.
En la función int main(void) está la rutina que va recorriendo todos los numeros y va buscando los factores que lo hacen vampiro. Si es un numero vampiro escribe el número y los factores que lo forman.
--------------------------------------------
Saludos! |
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 01/10/2007 1:24 pm | | | Título: |
| Por lo que veo ya solo te falta hacer las permutaciones (lo mas difícil del problema creo yo), un numero vampiro puede estar compuesto de la multiplicación de cualquiera de sus dígitos permutados formando grupos (ahí es nada).
Características de los números vampiros: Tienen que tener una cantidad par de dígitos. Cada factor estará compuesto por la mitad del número de dígitos.
En primer lugar tienes que hacer las permutaciones en base a que nP = e! Luego formar un número nuevo con cada permutación. Descomponer en factores los subgrupos posibles, hacer la multiplicaron. Tomarse una cervecilla después de comprobar que todo funciona.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3853 Ubicación: Mexico
| Publicado: 01/10/2007 3:52 pm | | | Título: |
| Un problema seria el primer numero vampiro (el numero 126), este tiene un numero de digitos impar (por la separacion en mitades no habria problema utilizando la division entera).
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 01/10/2007 5:05 pm | | | Título: |
| Esta es mi propuesta:
| Código: | Editado, solucionando un par bugs |
Me lo he pasado en grande desarrollando este programa, sobre todo con la función permutator, he querido hacerla genérica, esto hace que el programa pierda algo de eficiencia, pero creo que es interesante para en un futuro reutilizarla (para generar claves con un diccionario por ejemplo :-D) falta lo de siempre, lo mas arduo, gestionar, errores, validaciones, comentarios del código, etc.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso.
Ultima edición por cheroky el 02/10/2007 8:51 am; editado 1 vez |
| | Volver arriba | |  | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 91
| Publicado: 01/10/2007 9:34 pm | | | Título: |
| | cheroky escribió: | Por lo que veo ya solo te falta hacer las permutaciones (lo mas difícil del problema creo yo), un numero vampiro puede estar compuesto de la multiplicación de cualquiera de sus dígitos permutados formando grupos (ahí es nada).
|
Las permutaciones ya están consideradas en mi código, sino no encontraría ningún número.
Pues si tu pillas una ristra de dígitos y los partes en dos partes y los operas la multiplicación siempre será menor.
abcdefghijk > abcd * efghijk (Nunca se da la igualdad) 126 > 1*26 126 > 12*6
Segundo, no estoy de acuerdo con que cada número está compuesto por la mitad de número de dígitos, te pondré un ejemplo de que no pasa(ni habitualmente:
25510=5*5102 145273=53*2741 960988*=98*9806
edit: como puedes ver hay números de cifras impares que son vampiros 153=5*31 688=8*86 10251=51*201 ...
Por cierto, todos hallados con mi programa ¿a donde le faltan las permutaciones?
Cuando vuelva de la uni miro tu programa. 
Saludos! |
| | Volver arriba | |  | | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 02/10/2007 8:50 am | | | Título: |
| | Pantalàimon_ escribió: | | Las permutaciones ya están consideradas en mi código, sino no encontraría ningún número. |
Bien por tí, supuse que aún no estaba terminado. Ademas el formateo del código no invita a mirarlo mucho.
| Pantalàimon_ escribió: | Pues si tu pillas una ristra de dígitos y los partes en dos partes y los operas la multiplicación siempre será menor. abcdefghijk > abcd * efghijk (Nunca se da la igualdad) 126 > 1*26 126 > 12*6
Segundo, no estoy de acuerdo con que cada número está compuesto por la mitad de número de dígitos, te pondré un ejemplo de que no pasa(ni habitualmente:
|
Yo ni invente ni descubri los números vampiros y tampoco es una opinión solo me limito a buscar información. Una cita de la wiki en ingles:
Pseudovampire numbers are similar to vampire numbers, except that the fangs of an n-digit pseudovampire number need not be of length n/2 digits. Pseudovampire numbers can have an odd number of digits, for example 126 = 6×21.
¿Que sorpresa verdad? Resulta que tus pequeños vampiros son de pega.
Otra cita del wiki:
The vampire numbers are (sequence A014575 in OEIS):
1260, 1395, 1435, 1530, 1827, 2187, 6880, 102510, 104260, 105210, 105264, 105750, 108135, 110758, 115672, 116725, 117067, 118440, 120600, 123354, 124483, 125248, 125433, 125460, 125500, ... Que por cierto coincide con la secuencia generada por mi programa.
| Pantalàimon_ escribió: | edit: como puedes ver hay números de cifras impares que son vampiros 153=5*31 688=8*86 10251=51*201 ... |
Ahora ya sabes que no.
| Pantalàimon_ escribió: | | Por cierto, todos hallados con mi programa :? ¿a donde le faltan las permutaciones? |
Ahora te toca revisar tu programa.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 91
| Publicado: 02/10/2007 10:30 am | | | Título: |
| | cheroky escribió: | | Bien por tí, supuse que aún no estaba terminado. Ademas el formateo del código no invita a mirarlo mucho. |
Me gustaría saber como hacer un buen formateo. Creo que las variables tienen nombres bastante explícitos y por si acaso luego he hecho una pequeña explicación de lo que hace.
| cheroky escribió: | Yo ni invente ni descubri los números vampiros y tampoco es una opinión solo me limito a buscar información. Una cita de la wiki en ingles:
Pseudovampire numbers are similar to vampire numbers, except that the fangs of an n-digit pseudovampire number need not be of length n/2 digits. Pseudovampire numbers can have an odd number of digits, for example 126 = 6×21.
¿Que sorpresa verdad? Resulta que tus pequeños vampiros son de pega.
Otra cita del wiki:
The vampire numbers are (sequence A014575 in OEIS):
1260, 1395, 1435, 1530, 1827, 2187, 6880, 102510, 104260, 105210, 105264, 105750, 108135, 110758, 115672, 116725, 117067, 118440, 120600, 123354, 124483, 125248, 125433, 125460, 125500, ... Que por cierto coincide con la secuencia generada por mi programa. |
Bueno, pues acepto esta definición por convenio si quieres, no pasa nada, aunque no es la única. He visto en varios lugares definir los pseudovampiros como vampiros. No es un problema de invención, descubrimiento o opinión, es un problema de definición, es decir, de lenguaje. Así que yo no me atreviría a decir ni que tienes razón tú ni que tengo razón yo, todo depende de en que idioma haya hablado bosterito.
| cheroky escribió: | Ahora te toca revisar tu programa.
S2. |
Pues revisar no, que mi programilla que genera números pseudovampiros ya me gusta. Pero otro que genere números vampiros si que voy a hacer que siempre me han picado los retos. 
Me a parecido notar en tus palabras cierto enfado. Si es así, no pienses que mi anterior post iba con mala intención, simplemente estaba plenamente convencido que sólo existía la definición que había encontrado al clicar la primera páginas encontradas en el google y que lo que decías era una deducción de esa definición. Por eso no estaba de acuerdo. Pero sabido esto ya está todo aclarado. Voy a probar que programa me sale con la definición de la wiki. 
Saludos! |
| | Volver arriba | |  | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 02/10/2007 10:52 am | | | Título: |
| | Pantalàimon_ escribió: | | Me gustaría saber como hacer un buen formateo. Creo que las variables tienen nombres bastante explícitos y por si acaso luego he hecho una pequeña explicación de lo que hace. |
Me refiero al indentación, prefiero variables cortas pero que se vea las rutinas por bloques.
| Pantalàimon_ escribió: | | Bueno, pues acepto esta definición por convenio si quieres, no pasa nada, aunque no es la única. He visto en varios lugares definir los pseudovampiros como vampiros. No es un problema de invención, descubrimiento o opinión, es un problema de definición, es decir, de lenguaje. Así que yo no me atreviría a decir ni que tienes razón tú ni que tengo razón yo, todo depende de en que idioma haya hablado bosterito. |
Entonces, sin querer liar más el asunto, creo que no deberías haber dicho en tu anterior post lo contrario.
En lo que si estaras conmigo es que este número
| Código: | 126000=6*21000 126000=21*6000 126000=60*2100 | generado por tu programa no es vampiro ni pseudovampiro.
| Pantalàimon_ escribió: | | Me a parecido notar en tus palabras cierto enfado. Si es así, no pienses que mi anterior post iba con mala intención |
No, en absoluto, tiendo ser algo sarcastico, perdona si te he molestado. En cuanto a tu programa he de decir que me gusta bastante aunque todavia no lo he probado en profundidad.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |