Autor Tema: Escribir los 100 primeros números primos en C en un vector.

0 Usuarios y 1 Visitante están viendo este tema.

18 Febrero, 2013, 07:10 pm
Leído 6969 veces

xamo

  • Aprendiz
  • Mensajes: 373
  • Karma: +0/-0
  • Sexo: Femenino
Hola a todos.

En esta ocasión el ejercicio me dice:

Realizar un programa que almacene en un vector los 100 primeros números primos, y luego los muestre de mayor a menor.


En mi intento he creado la función para determinar si un número es primo:

int esprimo (int n){
    int i;

    if(n<1) return 0;
   
    for(i=1;i<=sqrt(n);i++)
    if(n%i==0) return 0;

return 1;
}


y mi propósito es usarla para determinar que números formarán parte del vector.
El problema es que no se me ocurre ninguna manera "eficiente" de resolver el problema. Una de mis últimas ideas es crear un vector "lo suficientemente grande" (por ejemplo, v[5000]), y usar la función a cada componente del vector y si, por ejemplo, v[j] no es primo, correr los valores del vector a la izquierda a partir de este número mediante un bucle for (que supongo que no será muy complicado). Es decir: v[j] = v[j+1], v[j+1] = v[j+2],... pero teniendo en cuenta la gran longitud del vector no me termina de convencer.

¿alguien puede darme alguna sugerencia o indicación para ir por buen camino? Porque estoy segura de que este muy bueno no puede ser.  :P

Muchas gracias y saludos.

18 Febrero, 2013, 07:36 pm
Respuesta #1

feriva

  • Matemático
  • Mensajes: 8,937
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)


int esprimo (int n){
    int i;

    if(n<1) return 0;
   
    for(i=1;i<=sqrt(n);i++)
    if(n%i==0) return 0;

return 1;
}




Hola, xamo. No, así no te va a dar los primos, me parece. Necesitarías meter el resultado de la raíz de "n" en otra variable, después del for; por ejemplo, sea la variable "a" igual a raíz de "n".

 Voy a ver si lo intento en javascript, y si me sale te digo la mecánica en caso de que sepa traducirlo a C

Saludos.

19 Febrero, 2013, 01:57 pm
Respuesta #2

feriva

  • Matemático
  • Mensajes: 8,937
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)
Hola, anoche me fui a la cama y no acabé a hacer porque me lié;


He hecho uno al estilo de como se programaba en los albores de la micronformática, pero no sé lo que te dirían :D

Dado que el número de naturales es finito podemos ahcerlo así:
La raíz cuadrada de 100 es 10, y sólo tenemos, por debajo de diez, los primos 2,3,5,7

Código: [Seleccionar]

#include <stdio.h>
#include <math.h>

int main(void) {int n=1;
printf("2, 3, 5, 7, ");
 
prueba: n++; if(n==101) goto fin;
if((n%2 && n%3 && n%5 && n%7)==!0)
printf("%d,", n);
goto prueba;

fin: getchar();
}


perdón, que dice de mayor a menor y no me había fijado, voy a arreglarlo

19 Febrero, 2013, 02:17 pm
Respuesta #3

feriva

  • Matemático
  • Mensajes: 8,937
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)
De mayor a menor quedaría así:

Código: [Seleccionar]
int main(void) {int n=100;
 
prueba: n--; if(n==7) goto fin;
if((n%2 && n%3 && n%5 && n%7)==!0)
printf("%d,", n);
goto prueba;
fin: printf("7, 5, 3, 2, "); getchar();
}


Saludos.

19 Febrero, 2013, 02:52 pm
Respuesta #4

xamo

  • Aprendiz
  • Mensajes: 373
  • Karma: +0/-0
  • Sexo: Femenino
Muchas gracias por molestarte y ayudar.  :)

Ahora no puedo, pero más tarde lo miraré más tranquila y detalladamente y a ver si llego a buen puerto.  :P

Saludos.

19 Febrero, 2013, 03:58 pm
Respuesta #5

xamo

  • Aprendiz
  • Mensajes: 373
  • Karma: +0/-0
  • Sexo: Femenino
Bueno, para al menos ir tanteando he decidido afrontarlo de la siguiente manera: pedir al usuario un número menor que uno dado (sea 2000), y los primos que obtengamos añadirlos a un vector ya creado y sin preocuparme aún por ordenarlo. Ha quedado así (aunque hay un fallo, que al final comentaré):

/*Realizar un programa que almacene en un vector los 100 primeros números primos, y
luego los muestre de mayor a menor.*/

int esprimo (int n){
    int i;

    if(n<1) return 0;
   
    for(i=2;i<=n/2;i++)
    if(n%i==0) return 0;

return 1;
}

int main()
{
    int v[1000]; /*vector donde alojaremos los numeros primos*/
    int numero; /*numero hasta donde buscar los primos. En nuestro caso particular es 100*/
    int valores; /* todos los numeros que debemos "comprobar" si son primos */
    int i;
   
// Solicitamos el numero por pantalla, y exigimos que se repita si el numero es superior a 2000

do{
   printf("Introduzca un numero menor que 2000\n");
   scanf("%d",&numero);}
while(numero > 2000);

// Un bucle for que recorre todos los valores con los que usaremos la funcion esprimo

   for(valores=1;valores<=numero;valores++){

//Un bucle for que recorre las componentes del vector y les asignamos aquellos valores que son primo
   for(i=valores; i<1000; i++){
       if(esprimo(valores)==1)
   v[i-1] = valores;
       
   }}
   
   for(i = 0; i<numero; i++){
         printf ("v[%d] = %d\n", i, v[i]);
         }
   
   system ("pause");
   return 0;
   
}


Sin embargo, a la hora de ejecutarlo si introducimos numero = 20, tenemos como resultado:
1 2 3 3 5 5 7 7 7 7 11 11 13 13 13 13 17 17 19 19

Pero no sé si es porqué estaré mareada o algo que no veo donde está el fallo que hace que estos números se repitan en los "huecos" donde no hay números primos (es decir, 1 2 3 3 5, el "3" ocupa el lugar del "4"). ¡Al menos la cosa marcha!  :)

Si alguien ve el error en el código por favor que me lo comente.  :banghead:

19 Febrero, 2013, 04:23 pm
Respuesta #6

feriva

  • Matemático
  • Mensajes: 8,937
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)
Muchas gracias por molestarte y ayudar.  :)

Ahora no puedo, pero más tarde lo miraré más tranquila y detalladamente y a ver si llego a buen puerto.  :P

Saludos.

No te vuelvas loca con eso tan largo :D, el mío funciona perfectamente, pruébalo.

 Si no te dejan usar goto, verás que se puede cambiar por un ciclo for de forma muy sencilla, pero he intentado imitar los pasos de la máquina, por eso lo he programado así; si te fijas el código habla por si mismo, lo puede entender hasta alguien que no sepa programación; con un bucle for sería así:

Código: [Seleccionar]
int main(void) {int n=100;
for(n=100; n>8; n--)
if((n%2 && n%3 && n%5 && n%7)==!0)
{printf("%d,", n);} printf("7,5,3,2");
getchar();
}

poniendo las librerías stido.h y math.h, claro (el ejecutable pesa sólo 144 kb).

 Naturalmente, está diseñado para el caso que te piden; y es lícito usar los únicos divisores primos porque son muy pocos. Si te pidieran hasta el 1000, por ejemplo, ya no lo haríamos así, pero como sólo te piden hasta el 100... Es como cuando puedes hacer una demostración con un contraejemplo; siempre hay que buscar lo más sencillo para el caso requerido.

 Saludos.

19 Febrero, 2013, 06:07 pm
Respuesta #7

xamo

  • Aprendiz
  • Mensajes: 373
  • Karma: +0/-0
  • Sexo: Femenino
Tieness razón el tuyo es mucho más sencillo y la verdad es que funciona perfectamente  :aplauso:. Sabe Dios porque me he querido comer tanto la cabeza  :-X

Muchas gracias por todo  :D, ahora si que tengo un concepto sobre el ejercicio mucho más claro.

19 Febrero, 2013, 06:26 pm
Respuesta #8

feriva

  • Matemático
  • Mensajes: 8,937
  • País: es
  • Karma: +1/-0
  • Sexo: Masculino
  • ¡EUKERA!... ¡UEREKA!... ¡EUREKA! (corregido)
Tieness razón el tuyo es mucho más sencillo y la verdad es que funciona perfectamente  :aplauso:. Sabe Dios porque me he querido comer tanto la cabeza  :-X

Muchas gracias por todo  :D, ahora si que tengo un concepto sobre el ejercicio mucho más claro.

De nada. De todas formas, podría ser que el profesor quisiera un método más general (aunque en ese caso yo creo que hubiera pedido la lista de más primos, no sé). Tengo una idea muy buena para tal caso pero no la puedo poner en práctica porque no me funciona la librería stack con la configuración de la IDE que tengo. Se trataría de, una vez que se comprueba que el resto del un número da cero, sacarlo del array del vector mediante la instrucción pop; esto podría ahorra el uso de un ciclo for dentro de otro, que es otra cosa que se puede hacer, pero no puedo por eso que te digo, y entonces no sé si puede llevar a la práctica ni los problemas que puede dar.
A ver si pasa por aquí Argentinator  ::)  o Pablo y dan una idea alternativa más académica (no sea que eso no vaya a valer, que una cosa es la visión en cuanto a la economía o elegancia matemática y otra la visión informática).

Saludos.