Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: luis456 en 5 Enero 2013, 11:23 am



Título: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: luis456 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


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: avesudra 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. }


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: BlackZeroX (Astaroth) en 6 Enero 2013, 05:15 am
En lugar de reinventar la rueda ( Quicksort ) usa qsort() (http://www.cplusplus.com/reference/cstdlib/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!¡.


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: luis456 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






Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: avesudra en 6 Enero 2013, 12:10 pm
En lugar de reinventar la rueda ( Quicksort ) usa qsort() (http://www.cplusplus.com/reference/cstdlib/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.    }


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: luis456 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


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: avesudra 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 :/


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: luis456 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


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: avesudra 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. }


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: luis456 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. }


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: Novlucker en 7 Enero 2013, 12:55 pm
Al ver las distintas preguntas en el post me pregunto, la idea es que te ayuden con el código o que lo hagan todo por ti?  :¬¬


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: leosansan en 7 Enero 2013, 15:19 pm
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

Además surge una duda, al introducir 2,3,7,0 da como primos 3,7 .... ¿y el 2?.
Para que tengas otro enfoque en el siguiente código:
* se pide al usuario que introduzca previamente el total de números a ingresar.
* Como ordenación he usado el método burbuja.
* Guardo los números primos en un arrray, de tamaño el número de primos que hay, por si tuviera que usarlos posteriormente para otra cosa.

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. using namespace std;
  4.  
  5. void burbuja(int a[], int n){
  6.     int indiceintercambio, j,i;
  7.     i=n-1;
  8.     while(i>0)
  9.     {
  10.        indiceintercambio=0;
  11.        for(j=0; j<i; j++)
  12.            if(a[j]>a[j+1])
  13.            {
  14.                 int aux = a[j];
  15.                 a[j]=a[j+1];
  16.                 a[j+1]=aux;
  17.                 indiceintercambio=j;
  18.            }
  19.        i = indiceintercambio;
  20.     }
  21.  
  22. }
  23.  
  24. int primo(int n){
  25.    int res;
  26.    if(n==1) return false;
  27.    for(int i=2; i < n; i++){
  28.        res = n % i;
  29.        if(res==0) return false;
  30.    }
  31.    return true;
  32. }
  33.  
  34. int main(){
  35.   bool primos = false;
  36.    int cont = 0,n;
  37.    cout << "Indique el total  de numeros: ";
  38.    cin >>n;
  39.    int numero[n],temp[n];
  40.   for(int j=0;j<n;j++){
  41.        cout << "Introduzca  numero " << j+1 <<": ";
  42.        cin >> numero[j];
  43.    }
  44.   cout << "Desordenados: ";
  45.    for(int k=0;k<n;k++){
  46.        primos = primo(numero[k]);
  47.        if(primos==true) {
  48.            temp[cont]= numero[k];
  49.            cout << temp[cont] <<"  ";
  50.            cont++;
  51.        }
  52.    }
  53.  cout << endl << "Hay " << cont << " numeros primos"<<endl;
  54.  cout << endl<< endl;
  55.  
  56.   int num_primo[cont];
  57.   for(int k=0;k<cont;k++){
  58.      num_primo[k]=temp[k];
  59.   }
  60.   cout << endl<< "Ordenados: ";
  61.   burbuja(num_primo,cont);
  62.    for(int k=0;k<cont;k++){
  63.      cout << num_primo[k] <<"  ";
  64.   }
  65. cout << endl;
  66.    system ("pause");
  67.    return 0;
  68. }
  69.  
Saluditos!.
P.D: Cámbiate de Dev a Code::Blocks, además de otras cosas el uso de pestañas y múltiples ventanitas en la misma ventana le hace más versátil . ... y pausa automáticamente el programa .... y es libre.


Título: Re: Saber numeros primeros en una cadena desordenada pero a voluntad del usuario ?
Publicado por: luis456 en 7 Enero 2013, 19:19 pm
Este si tira y tenias razón en lo de los arrray:)

Gracias me sirve un monton y otra cosa ya tengo el codeblok y lo estoy mirando ya lo pase a español pero no esta completo.ejjeje esta medio y medio .pero como sabes el hombre es animal de constumbres.

Gracias
Luis