elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?  (Leído 3,428 veces)
luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« en: 5 Enero 2013, 11:23 am »

Código:
En este codigo que saca los numeros primos ,se podria hacerlo pero que el usuario ponga la cantidad de numeros y sin importar el orden de los mismos ?

que se ponga ejemplo 1 3 5 48 99 75 65 88  77  a lo bestia por decir algo y que el programa diga cuales son los primos y los muestre ahora si en orden ?


[code#include<iostream>
using namespace std;
 
int main()
{
  int n=0,c=0,c2=0,res=0,nc=0;
  cout<<"Introduce el limite de numeros: "; cin>>n;
  for(c=1;c<=n;c++)
  {
    for(c2=1;c2<=c;c2++)
    {
      res=c%c2;
      if(res==0)
      {
        nc=nc+1;
      }
    }
    if(nc==2)
    {
      cout<<" "<<c;
    }
    nc=0;
  }
  system("pause");//Damos una pausa antes de finalizar el programa
return 0;
}]


Luis


En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #1 en: 5 Enero 2013, 14:25 pm »

Si pero habría que parar de introducir de alguna manera , como pedirle al usuario que el último número sea un 0, o cuantos números piensa introducir que no es lo más común, en este programa que acabo de hacer he utilizado el algoritmo de ordenación Quicksort , y las funciones las he sacado de aquí:

http://blog.e-urrea.com/noticias/2011/03/23/metodo-de-ordenacion-burbuja-y-quicksort-en-c/

Tu código es complicado de entender porque no utilizas nombres de variables descriptivos :S .El código que tienes ahí abajo va introduciendo numeros a la variable arrayDeNumeros hasta que se introduce un 0, después ordena el array y mira si cada numero es primo. Es sencillo. Te dejo el que he hecho así rápido para que te hagas una idea:
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. bool esPrimo(unsigned int num);
  8. void Quicksort(int *unarray, int izq, int der);
  9. int pivot(int *unarray, int izq, int der);
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.    int *arrayDeNumeros= (int*) calloc(1000,sizeof(int*));
  14.    int lenArray = 0;
  15.    cout << "Ingrese una cadena de numeros terminada en 0:" << endl;
  16.    cin>>arrayDeNumeros[0];
  17.    for(register int i = 1; arrayDeNumeros[i-1]!=0 ; ++i)
  18.    {
  19.        cin>>arrayDeNumeros[i];
  20.        lenArray = i;
  21.    }
  22.    /** El algoritmo que viene a continuación lo que hace
  23.      *  es ordenar  el array  arrayDeNumeros de  menor  a
  24.      *  mayor,sinceramente,no sé como funciona solo que he
  25.      *  leído que era rápido y lo he buscado.
  26.      */
  27.  
  28.    Quicksort(arrayDeNumeros,0,lenArray);
  29.    /**
  30.      *  El siguiente bucle mira si los enteros que ya están
  31.      *  ordenados son primos o no.
  32.      */
  33.    for(register int i = 1; arrayDeNumeros[i]!=0; ++i)
  34.    {
  35.        if(esPrimo(arrayDeNumeros[i]))
  36.            cout<<"El numero "<<arrayDeNumeros[i]<<" es primo."<<endl;
  37.        else
  38.            cout<<"El numero "<<arrayDeNumeros[i]<<" no es primo."<<endl;
  39.    }
  40.    return 0;
  41. }
  42.  
  43. void Quicksort(int *unarray, int izq, int der)
  44. {
  45.    int pivote;
  46.    if(izq < der)
  47.    {
  48.        pivote=pivot(unarray, izq, der);
  49.        Quicksort(unarray, izq, pivote-1);
  50.        Quicksort(unarray, pivote+1, der);
  51.    }
  52. }
  53. int pivot(int *unarray, int izq, int der)
  54. {
  55.    int i;
  56.    int pivote, valor_pivote;
  57.    int aux;
  58.  
  59.    pivote = izq;
  60.    valor_pivote = unarray[pivote];
  61.    for (i=izq+1; i<=der; i++)
  62.    {
  63.        if (unarray[i] < valor_pivote)
  64.        {
  65.            pivote++;
  66.            aux=unarray[i];
  67.            unarray[i]=unarray[pivote];
  68.            unarray[pivote]=aux;
  69.  
  70.        }
  71.    }
  72.    aux=unarray[izq];
  73.    unarray[izq]=unarray[pivote];
  74.    unarray[pivote]=aux;
  75.    return pivote;
  76. }
  77. bool esPrimo(unsigned int num)
  78. {
  79.    if(num>2 && (num%2==0))/* Si el número es mayor que 2 y es divisible por el entonces no es primo*/
  80.        return false;
  81.    /**
  82.      * Para comprobar si un número es primo se suele
  83.      * utilizar el siguiente algoritmo, que consiste
  84.      * en llegar hasta la raiz cuadrada del número de
  85.      * dos en dos y empezando en 3, ya que un número
  86.      * que no es par en la vida puede ser dividido por
  87.      * un par.
  88.      */
  89.    unsigned int numSquare = (unsigned int)sqrt(num);
  90.    for(register unsigned int i =3; i<=numSquare ; i+=2)
  91.    {
  92.        if(num%i==0)
  93.        {
  94.            return false;
  95.        }
  96.    }
  97.    return true;
  98. }


En línea

Regístrate en
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.142


I'Love...!¡.


Ver Perfil WWW
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #2 en: 6 Enero 2013, 05:15 am »

En lugar de reinventar la rueda ( Quicksort ) usa qsort(), aun que en el código no es necesario usar este algoritmo... posiblemente solo hacer un "registro" o cache de los números generados para aumentar la velocidad, pero para números tan pequeños es mejor así.

Dulces Lunas!¡.
« Última modificación: 6 Enero 2013, 05:19 am por BlackZeroX (Astaroth) » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #3 en: 6 Enero 2013, 10:47 am »

Si pero habría que parar de introducir de alguna manera , como pedirle al usuario que el último número sea un 0, o cuantos números piensa introducir que no es lo más común, en este programa que acabo de hacer he utilizado el algoritmo de ordenación Quicksort , y las funciones las he sacado de aquí:

http://blog.e-urrea.com/noticias/2011/03/23/metodo-de-ordenacion-burbuja-y-quicksort-en-c/

Tu código es complicado de entender porque no utilizas nombres de variables descriptivos :S .El código que tienes ahí abajo va introduciendo numeros a la variable arrayDeNumeros hasta que se introduce un 0, después ordena el array y mira si cada numero es primo. Es sencillo. Te dejo el que he hecho así rápido para que te hagas una idea:
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. bool esPrimo(unsigned int num);
  8. void Quicksort(int *unarray, int izq, int der);
  9. int pivot(int *unarray, int izq, int der);
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.    int *arrayDeNumeros= (int*) calloc(1000,sizeof(int*));
  14.    int lenArray = 0;
  15.    cout << "Ingrese una cadena de numeros terminada en 0:" << endl;
  16.    cin>>arrayDeNumeros[0];
  17.    for(register int i = 1; arrayDeNumeros[i-1]!=0 ; ++i)
  18.    {
  19.        cin>>arrayDeNumeros[i];
  20.        lenArray = i;
  21.    }
  22.    /** El algoritmo que viene a continuación lo que hace
  23.      *  es ordenar  el array  arrayDeNumeros de  menor  a
  24.      *  mayor,sinceramente,no sé como funciona solo que he
  25.      *  leído que era rápido y lo he buscado.
  26.      */
  27.  
  28.    Quicksort(arrayDeNumeros,0,lenArray);
  29.    /**
  30.      *  El siguiente bucle mira si los enteros que ya están
  31.      *  ordenados son primos o no.
  32.      */
  33.    for(register int i = 1; arrayDeNumeros[i]!=0; ++i)
  34.    {
  35.        if(esPrimo(arrayDeNumeros[i]))
  36.            cout<<"El numero "<<arrayDeNumeros[i]<<" es primo."<<endl;
  37.        else
  38.            cout<<"El numero "<<arrayDeNumeros[i]<<" no es primo."<<endl;
  39.    }
  40.    return 0;
  41. }
  42.  
  43. void Quicksort(int *unarray, int izq, int der)
  44. {
  45.    int pivote;
  46.    if(izq < der)
  47.    {
  48.        pivote=pivot(unarray, izq, der);
  49.        Quicksort(unarray, izq, pivote-1);
  50.        Quicksort(unarray, pivote+1, der);
  51.    }
  52. }
  53. int pivot(int *unarray, int izq, int der)
  54. {
  55.    int i;
  56.    int pivote, valor_pivote;
  57.    int aux;
  58.  
  59.    pivote = izq;
  60.    valor_pivote = unarray[pivote];
  61.    for (i=izq+1; i<=der; i++)
  62.    {
  63.        if (unarray[i] < valor_pivote)
  64.        {
  65.            pivote++;
  66.            aux=unarray[i];
  67.            unarray[i]=unarray[pivote];
  68.            unarray[pivote]=aux;
  69.  
  70.        }
  71.    }
  72.    aux=unarray[izq];
  73.    unarray[izq]=unarray[pivote];
  74.    unarray[pivote]=aux;
  75.    return pivote;
  76. }
  77. bool esPrimo(unsigned int num)
  78. {
  79.    if(num>2 && (num%2==0))/* Si el número es mayor que 2 y es divisible por el entonces no es primo*/
  80.        return false;
  81.    /**
  82.      * Para comprobar si un número es primo se suele
  83.      * utilizar el siguiente algoritmo, que consiste
  84.      * en llegar hasta la raiz cuadrada del número de
  85.      * dos en dos y empezando en 3, ya que un número
  86.      * que no es par en la vida puede ser dividido por
  87.      * un par.
  88.      */
  89.    unsigned int numSquare = (unsigned int)sqrt(num);
  90.    for(register unsigned int i =3; i<=numSquare ; i+=2)
  91.    {
  92.        if(num%i==0)
  93.        {
  94.            return false;
  95.        }
  96.    }
  97.    return true;
  98. }


Gracias por el codigo y la respuesta pero lo que nesecito es que me muestre cuales son los numeros primos ordenados y este lo que me dice si son o nos son primos

Luis




En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #4 en: 6 Enero 2013, 12:10 pm »

En lugar de reinventar la rueda ( Quicksort ) usa qsort(), aun que en el código no es necesario usar este algoritmo... posiblemente solo hacer un "registro" o cache de los números generados para aumentar la velocidad, pero para números tan pequeños es mejor así.

Dulces Lunas!¡.
Gracias BlackZeroX (Astaroth) no sabía de la existencia de esa función. luis456 en cuanto a lo que dices solo habría que cambiar esto:
Código
  1. for(register int i = 1; arrayDeNumeros[i]!=0; ++i)
  2.    {
  3.        if(esPrimo(arrayDeNumeros[i]))
  4.            cout<<arrayDeNumeros[i]<<endl;
  5.    }
En línea

Regístrate en
luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #5 en: 6 Enero 2013, 13:32 pm »

Gracias a los dos por sus respuestas ahora cambie lo que me has dicho pero no logro parar el programa para ver el resultado ? estoy poniendo esto

pero no va
luis

Código:
system("pause");//Damos una pausa antes de finalizar el programa
En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #6 en: 6 Enero 2013, 15:46 pm »

Es mejor que utilices:
Código
  1. cin.sync();// Para ignorar los carácteres no leidos...(limpiar el buffer)
  2. cout << endl<<endl<<"Presione una tecla para continuar . . .";
  3. cin.get();// Utiliza esto que es portable.
Lo siento se me olvidó ponerlo en el código :/
En línea

Regístrate en
luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #7 en: 6 Enero 2013, 16:24 pm »

Es mejor que utilices:
Código
  1. cin.sync();// Para ignorar los carácteres no leidos...(limpiar el buffer)
  2. cout << endl<<endl<<"Presione una tecla para continuar . . .";
  3. cin.get();// Utiliza esto que es portable.
Lo siento se me olvidó ponerlo en el código :/


Ya me volvi un ocho jejej se supone que debo eliminar y poner eso donde ? al principio o al final ya que lo he puesto y solo me sale lo de presionar la tecla

luis
En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #8 en: 6 Enero 2013, 20:20 pm »

Así lo tengo yo y funciona(he cambiado las funciones por la que decía Blackzero):
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. bool esPrimo(unsigned int num);
  8. int int_cmp(const void *a, const void *b);//Función para pasarla a qsort
  9.  
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.    int *arrayDeNumeros= (int*) calloc(1000,sizeof(int*));
  14.    int lenArray = 0;
  15.    cout << "Ingrese una cadena de numeros terminada en 0:" << endl;
  16.    cin >> arrayDeNumeros[0];
  17.    for(register int i = 1; arrayDeNumeros[i-1]!=0 ; ++i)
  18.    {
  19.        cin>>arrayDeNumeros[i];
  20.        lenArray = i;
  21.    }
  22.    /** El algoritmo que viene a continuación lo que hace
  23.      *  es ordenar  el array  arrayDeNumeros de  menor  a
  24.      *  mayor,sinceramente,no sé como funciona solo que he
  25.      *  leído que era rápido y lo he buscado.
  26.      */
  27.  
  28.    qsort(arrayDeNumeros,lenArray,4,int_cmp);
  29.    /**
  30.      *  El siguiente bucle mira si los enteros que ya están
  31.      *  ordenados son primos o no.
  32.      */
  33.    cout << "Los primos son: ";
  34.    for(register int i = 1; arrayDeNumeros[i]!=0; ++i)
  35.    {
  36.        if(esPrimo(arrayDeNumeros[i]))
  37.            cout<<arrayDeNumeros[i]<<" ";
  38.    }
  39.    cin.sync();// Para ignorar los carácteres no leidos...(limpiar el buffer)
  40.    cout << endl<<endl<<"Presione una tecla para continuar . . .";
  41.    cin.get();// Utiliza esto que es portable.
  42.    return 0;
  43. }
  44. bool esPrimo(unsigned int num)
  45. {
  46.    if(num>2 && (num%2==0))/* Si el número es mayor que 2 y es divisible por el entonces no es primo*/
  47.        return false;
  48.    /**
  49.      * Para comprobar si un número es primo se suele
  50.      * utilizar el siguiente algoritmo, que consiste
  51.      * en llegar hasta la raiz cuadrada del número de
  52.      * dos en dos y empezando en 3, ya que un número
  53.      * que no es par en la vida puede ser dividido por
  54.      * un par.
  55.      */
  56.    unsigned int numSquare = (unsigned int)sqrt(num);
  57.    for(register unsigned int i =3; i<=numSquare ; i+=2)
  58.    {
  59.        if(num%i==0)
  60.        {
  61.            return false;
  62.        }
  63.    }
  64.    return true;
  65. }
  66. int int_cmp(const void *a, const void *b)
  67. {
  68.    const int *ia = (const int *)a; // casting pointer types
  69.    const int *ib = (const int *)b;
  70.    return *ia  - *ib;
  71.    /* integer comparison: returns negative if b > a
  72.     and positive if a > b */
  73. }
« Última modificación: 6 Enero 2013, 20:22 pm por avesudra » En línea

Regístrate en
luis456


Desconectado Desconectado

Mensajes: 543



Ver Perfil
Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
« Respuesta #9 en: 7 Enero 2013, 09:57 am »

Sera que uso Dev ya que el programa no se detiene a mostrarme los numeros compila bien y todo,pero no me muestra nada de lo rapido que se sale

luis



Así lo tengo yo y funciona(he cambiado las funciones por la que decía Blackzero):
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. bool esPrimo(unsigned int num);
  8. int int_cmp(const void *a, const void *b);//Función para pasarla a qsort
  9.  
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.    int *arrayDeNumeros= (int*) calloc(1000,sizeof(int*));
  14.    int lenArray = 0;
  15.    cout << "Ingrese una cadena de numeros terminada en 0:" << endl;
  16.    cin >> arrayDeNumeros[0];
  17.    for(register int i = 1; arrayDeNumeros[i-1]!=0 ; ++i)
  18.    {
  19.        cin>>arrayDeNumeros[i];
  20.        lenArray = i;
  21.    }
  22.    /** El algoritmo que viene a continuación lo que hace
  23.      *  es ordenar  el array  arrayDeNumeros de  menor  a
  24.      *  mayor,sinceramente,no sé como funciona solo que he
  25.      *  leído que era rápido y lo he buscado.
  26.      */
  27.  
  28.    qsort(arrayDeNumeros,lenArray,4,int_cmp);
  29.    /**
  30.      *  El siguiente bucle mira si los enteros que ya están
  31.      *  ordenados son primos o no.
  32.      */
  33.    cout << "Los primos son: ";
  34.    for(register int i = 1; arrayDeNumeros[i]!=0; ++i)
  35.    {
  36.        if(esPrimo(arrayDeNumeros[i]))
  37.            cout<<arrayDeNumeros[i]<<" ";
  38.    }
  39.    cin.sync();// Para ignorar los carácteres no leidos...(limpiar el buffer)
  40.    cout << endl<<endl<<"Presione una tecla para continuar . . .";
  41.    cin.get();// Utiliza esto que es portable.
  42.    return 0;
  43. }
  44. bool esPrimo(unsigned int num)
  45. {
  46.    if(num>2 && (num%2==0))/* Si el número es mayor que 2 y es divisible por el entonces no es primo*/
  47.        return false;
  48.    /**
  49.      * Para comprobar si un número es primo se suele
  50.      * utilizar el siguiente algoritmo, que consiste
  51.      * en llegar hasta la raiz cuadrada del número de
  52.      * dos en dos y empezando en 3, ya que un número
  53.      * que no es par en la vida puede ser dividido por
  54.      * un par.
  55.      */
  56.    unsigned int numSquare = (unsigned int)sqrt(num);
  57.    for(register unsigned int i =3; i<=numSquare ; i+=2)
  58.    {
  59.        if(num%i==0)
  60.        {
  61.            return false;
  62.        }
  63.    }
  64.    return true;
  65. }
  66. int int_cmp(const void *a, const void *b)
  67. {
  68.    const int *ia = (const int *)a; // casting pointer types
  69.    const int *ib = (const int *)b;
  70.    return *ia  - *ib;
  71.    /* integer comparison: returns negative if b > a
  72.     and positive if a > b */
  73. }
En línea

Que tu sabiduria no sea motivo de Humillacion para los demas
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines