/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

numero vampiro
Ir a página 1, 2  Siguiente
 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
bosterito



Registrado: 02 Mar 2006
Mensajes: 24

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 28/09/2007 1:50 pm
Título:

Shocked 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 Laughing
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3853
Ubicación: Mexico

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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 Confused ¿a donde le faltan las permutaciones?

Cuando vuelva de la uni miro tu programa. Wink

Saludos!
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 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

MensajePublicado: 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. Razz

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. Smile

Saludos!
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 2Todas las horas están en GMT - 8 Horas
Ir a página 1, 2  Siguiente

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com