19/09/2019, 08:07:15 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: Homenaje a NUMERARIUS
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: algoritmo para numero vampiro?  (Leído 3008 veces)
0 Usuarios y 1 Visitante están viendo este tema.
maucapu15
Nuevo
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Femenino
Perú Perú

Mensajes: 6


Ver Perfil
« : 01/05/2010, 04:07:07 pm »

 Encontrar los número vampiros comprendidos en el intervalo [a, b] ingresado por el usuario, un numero vampiro es 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.
En línea
Phicar
Pleno*
*****

Karma: +1/-0
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 514



Ver Perfil WWW
« Respuesta #1 : 02/06/2010, 03:31:14 am »

pos que te digo yo, se me ocurre permutar sub cadenas de n y parametrizar...o se me ocurre descomponer he ir multiplicando hasta abarcar todas las posibilidades...el problema con los dos algoritmos que veo posibles es que si b es grande tomara muchisimo tiempo

el primer algoritmo es el mas posible...permutas y separas y puedes parametrizar con propiedades como impar multiplicado con impar da un impar...por ese estilo es la cosa...pero la vaina, optima no la veo..
En línea

redinfocol.org
Ezequiel
Junior
**

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 26


Ver Perfil
« Respuesta #2 : 02/06/2010, 12:39:48 pm »

Encontrar los número vampiros comprendidos en el intervalo [a, b] ingresado por el usuario, un numero vampiro es 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.

Fácil. Pruebas a dividir el número en cuestión, 126, por cada una de sus cifras,(1,2,->6), y si el resultado contiene el resto de las cifras del número original, 21, es un número vampiro. Repites este proceso para todo [a,b] y ya está.
En línea
argentinator
Consultar la FIRMAPEDIA __________________________________________________________________________________________________________________
Administrador
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 7.275

Vean mis posts activos en mi página personal


Ver Perfil WWW
« Respuesta #3 : 02/06/2010, 12:51:31 pm »

Bueno, pero se  ingresa un intervalo [a, b] es más óptimo me parece llevar a cabo un proceso de tipo "criba", ir tachando objetos de la lista que son, o que no son vampiros.

Las posibilidades son muchas, así que yo tacharía un número vampiro cuando finalmente lo encuentro, y si no, lo dejo sin tachar por si acaso en el futuro descubro que es vampiro.

Estos vampiros parece que chupan su propia sangre, no lo veo muy vampirezco.

Habría que hablar tal vez de "divisores vampiro" para concretar mejor las cosas.
Creo que eso simplificaría el procedimiento.

En vez de pararme en un número y fijarme si es o no vampiro,
mejor me paro en un número y me fijo si es "divisor vampiro" de alguno de la lista.

Además no está muy claro si los dígitos pueden repetirse,
porque si permitimos repeticiones, todo número que contenga a la cifra 1 seria vampiro: 2413 = 2413 * 1.

En línea

cheroky
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 143


Un globo, dos globos, tres globos...


Ver Perfil
« Respuesta #4 : 13/06/2010, 12:29:58 pm »

Aquí un programa que diseñé hace algún tiempo para generar números vampiros en C99, tiene detalles por pulir, cuando lo hice era más inexperto, pero la salida es correcta. Disculpas por la carencia de comentarios del algoritmo, queda como algo pendiente.

Código:
#include <stdio.h>
#include <stdint.h>
#define ITOC(vec,n) for(int8_t *p = (vec); (n); (n/=10)) (*p++) = (n%10)
#define NEG ~0x0LL

int ncmp(int8_t *buf, int y)
{
int tmp,bmp = 0, i=0;


    for (; y ;y/=10) {
        tmp =  y % 10;
    for(i = 0; i < 8; i++) {
        if(buf[i] == tmp && buf[i] != -1){
                buf[i] = -1;
                break;
        }
      }     
        bmp++;
    }     
    return bmp;
}

int ncmp2(int n, int y, int z)
{
int nn=0, r=0, par=0;

    for(;n ;n/=10){ nn+=  n%10; par++; }
    if( par & 1) return -1;
    for(;y ;y/=10) r+=   y%10;
    for(;z ;z/=10) r+=   z%10;

return nn - r;             
}

#define TOP 10000
int main()
{
int8_t buf[8];         
int y = 1 ,z = 1 , MAX = 100, n , prn;             
           
         
         *((uint64_t*) buf) = NEG; 
       
        for(;MAX < TOP;  MAX*=10 )
        for(y = MAX/10; y < MAX; y++)
        for(z = y ; z < MAX; z++)   { 
                prn = n = y * z;
                if(n / 10 != z)   {     
                    if(!ncmp2(n, y,  z))  {
                        ITOC(buf, n);
                        ncmp(buf, y);
                        ncmp(buf, z);
                        if( *((uint64_t*) buf) == NEG )
                            printf("%d=%d*%d\n", prn, y, z);
                    }
                }
        }
return 0;
}
   



This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.

José L. Gil Romera 1987-2009

Un saludo.
En línea

[texx]\color{black} \overrightarrow{\mathbb{C} h\exists \mathbb{R} \varnothing k Y}[/texx]
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!