elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:44  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Calculo de números primos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Calculo de números primos  (Leído 1,604 veces)
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Calculo de números primos
« en: 12 Noviembre 2011, 14:26 »

Me han dado el siguiente código de programa en c, es un programa que pide un numero por teclado e indica si el número es o no primo, comprobando todos los posibles divisores:



Código
#include <stdio.h>
int main()
{
 
int valor;
 
int i;
 
printf("Introduzca un valor: ");
scanf(" %d", &valor);
 
for ( i = 2; i < valor; i++ )
if (0 == (valor % i))
 
printf(" %d no es primo\n", valor);
return 0;
}

He probado el código y es un poco malo, si el número es primo directamente se sale del programa, y si el número no lo es, te lo repite por cada divisor que tenga, y me han pedido que haga que solo se imprima un mensaje indicando si el número es primo o no al final del bucle. Para esto, nos dicen que utilicemos una variable de control, cuando encuentre un divisor se active dicha variable. Y al final del bucle se mostrará el mensaje adecuado segun el valor de la variable de control.

He pensado que se tendría que usar la variable de control flag, pero no sé como implementarla muy bien, ¿alguien podría aclararmelo?, yo lo he intentado poniendo esto:

Código
#include <stdio.h>
int main()
{
 
int valor;
int i;
int flag;
printf("Introduzca un valor: ");
scanf(" %d", &valor);
 
flag=0;
 
for ( i = 2; i < valor; i++ )
if (0 == (valor % i))
{flag=1;
printf(" %d no es primo\n", valor);
}
else
flag=0;
printf(" %d es primo\n", valor);
return 0;
}

Pero aun así, al probarlo me sigue dando error, ¿alguna solución?

Saludos


En línea
DickGumshoe

Desconectado Desconectado

Mensajes: 145


Ver Perfil WWW
Re: Calculo de números primos
« Respuesta #1 en: 12 Noviembre 2011, 14:44 »

No sé si te servirá, pero yo hice este programa hace tiempo (aunque en él no uso "for"):

Código
#include<stdio.h>
#include<stdlib.h>
 
 
 
int main(void)
{
 
int num;
 
printf("\nIntroduce un numero");
scanf("%d",&num);
 
 
if((num%2==0) && (num!=2)){
                    printf("El numero no es primo");}
else{
 
if((num%3==0) && (num!=3)){
                      printf("El numero no es primo");}
else{
if((num%5==0) && (num!=5)){
 
 
                    printf("El numero no es primo");}
      else{  
 if((num%7==0) && (num!=7)){
                       printf("El numero no es primo");}
       else{
 
if((num%11==0) && (num!=11)){
                      printf("El numero no es primo");}
else{
     printf("El numero es primo");
}}}}}
 
system("pause");
 
 
 
 
 
}

Saludos.


En línea
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Calculo de números primos
« Respuesta #2 en: 12 Noviembre 2011, 14:52 »

Gracias por la ayuda, aunque me piden que use una variable de control (flag), por eso no puedo ponerlo como tu lo tienes.

Saludos!
En línea
$Edu$


Conectado Conectado

Mensajes: 1.414



Ver Perfil
Re: Calculo de números primos
« Respuesta #3 en: 12 Noviembre 2011, 15:02 »

Ademas si usas el metodo de DickgumShoe y lo probarias con un numero muy grande tendrias que hacer miles de ifs mas xD para ahorrar esos ifs es que se usan los bucles DickgumShoe.

Y lo de la variable flag, le puedes llamar como quieras, solo sera una variable auxiliar pero veo que la declaras y le asignas valores pero nunca verificas el valor para hacer algo.. cosa que esta al pedo sino xD
En línea

Estado en el MSN:
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Calculo de números primos
« Respuesta #4 en: 12 Noviembre 2011, 15:19 »

Ademas si usas el metodo de DickgumShoe y lo probarias con un numero muy grande tendrias que hacer miles de ifs mas xD para ahorrar esos ifs es que se usan los bucles DickgumShoe.

Y lo de la variable flag, le puedes llamar como quieras, solo sera una variable auxiliar pero veo que la declaras y le asignas valores pero nunca verificas el valor para hacer algo.. cosa que esta al pedo sino xD

EL problema es que no sé muy bien como usarla XD
En línea
$Edu$


Conectado Conectado

Mensajes: 1.414



Ver Perfil
Re: Calculo de números primos
« Respuesta #5 en: 12 Noviembre 2011, 15:44 »

Yo siempre recomiendo leer tranquilo un buen manual del lenguaje de programacion que quieren aprender, aprenderlo bien de bien, usar bucles bien de bien, saber muchas cosas y luego ahi si te vendra a la mente muchas posibles soluciones
En línea

Estado en el MSN:
тαптяαпсє


Desconectado Desconectado

Mensajes: 739


Usuario EHN


Ver Perfil
Re: Calculo de números primos
« Respuesta #6 en: 12 Noviembre 2011, 15:55 »

Aquí por si lo quereis primos, os dejo el codigo locos que escribe los primeros numeros primos, echadle un ojo.

Código
#include <stdio.h>
#include <stdlib.h>
#define N 999
 
//Primo a pillar speed jajaja
 
int main ()
{
   int i, j, primo;
   primo = 1;
   for (i = 2; i < N; i++)
   {
      for ( j = 2; j <= i/2; j++)
         if ((i%j) == 0)
            primo = 0;
      if(primo)
         printf("%d\n", i);
      primo = 1;
   }
   return 0;
}
En línea

$Edu$


Conectado Conectado

Mensajes: 1.414



Ver Perfil
Re: Calculo de números primos
« Respuesta #7 en: 12 Noviembre 2011, 16:05 »

Ahi tenes tu variable flag jamatbar, es la que el uso como "primo" que tambien podes declararla como booleana para que le asignes True or False
En línea

Estado en el MSN:
CobraCY

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: Calculo de números primos
« Respuesta #8 en: 12 Noviembre 2011, 16:10 »

Bueno soy nuevo y se me dio echarle una mano.

Puedes hacerlo con un while o con un for, para el caso recomiendo el for, también puedes usar un flag int o bool, me gusta más el bool, pero bueno te dejo un ejemplo con el bool y otro con el int y también.

Código
#include <iostream>
 
using namespace std;
int main()
{
int n;
cin >> n;
int flag=0;
for(int i=2; i < n && flag==0;i++)
{
if(n%i==0)
flag++;
}
 
if(flag==0 || n==1 || n==2)
cout << "Es primo" << endl;
else
cout << "No es primo" << endl;
return 0;
}
 
Este usa el flag en Int
Ahora uno que usa el Flag en bool
Código
#include <iostream>
 
using namespace std;
int main()
{
int n;
cin >> n;
bool flag=true;
for(int i=2; i < n && flag;i++)
{
if(n%i==0)
flag=false;
}
 
if(flag || n==1 || n==2)
cout << "Es primo" << endl;
else
cout << "No es primo" << endl;
return 0;
}
 
Este usa el flag en Bool, como ves solo cambian, mmm en realidad no cambia nada xD. :)

Saludos.
« Última modificación: 12 Noviembre 2011, 16:12 por CobraCY » En línea
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Calculo de números primos
« Respuesta #9 en: 12 Noviembre 2011, 16:40 »

Vale, leyendo más o menos lo que habeís puesto he hecho lo siguiente:

Código
#include <stdio.h>
int main()
{
 
int valor;
 
int i;
int flag;
 
printf("Introduzca un valor: ");
scanf(" %d", &valor);
 
for ( i = 2; i < valor; i++ )
if (0 == (valor % i))
flag=0;
if (flag)
printf("%d es primo\n",valor);
flag=1;
 
 
return 0;
}

Si meto un número primo me dice que es primo (sólo con una sentencia),¿que puedo hacer para poner una función si el numero que meto es no primo?

Además, me he dado cuenta de que si meto un 1,2 o 3 el programa sale directamente, ¿por qué?
Saludos
« Última modificación: 12 Noviembre 2011, 17:17 por jamatbar » En línea
Ferno

Desconectado Desconectado

Mensajes: 282


Ver Perfil
Re: Calculo de números primos
« Respuesta #10 en: 12 Noviembre 2011, 17:09 »

Si ponés un 1 o un 2 en tu programa, no entra ni siquiera una vez en el for, porque no se cumple la condición (i < valor), ya que i comienza en el número 2.
Sin embargo, no está bien el algoritmo. Ese bucle no hace nada. ¿Como sabés si es primo o no ahí?
Primero pensá el problema matemáticamente, luego pasalo a la máquina tal cual lo pienses.
En este caso, un número es primo si y solo si es divisible sólo por si mismo y por el 1.
Entonces, para pasarlo a máquina, tendrás que ver si el número es divisible por algún número entre el 1 y el mismo. Para eso se usa el bucle, cuando encuentres algún número que divida a tu valor, entonces no será primo (ahí entra el flag en funcionamiento), sino, es primo.
En línea
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Calculo de números primos
« Respuesta #11 en: 12 Noviembre 2011, 17:18 »

Perdon, me comí un par de líneas de código, ya lo he editado

Saludos
En línea
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: Calculo de números primos
« Respuesta #12 en: 12 Noviembre 2011, 17:33 »

En el caso de la aproximacion de fuerza bruta esta se puede mejorar un poco reduciendo el rango y utilizando al contador del bucle como bandera. De esta forma:
Código
#include <stdio.h>
#include <stdlib.h>
 
int es_primo(int num);
 
int main(void)
{
   int i;
 
   for (i = 2; i < 100; i++)
       if (es_primo(i))
           printf("%d\n", i);
 
   return EXIT_SUCCESS;
}
 
int es_primo(int num)
{
   int i;
 
   for (i = 2; i*i <= num && num % i != 0; i++)
       ;
 
   return i*i > num;
}

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Calculo de números primos
« Respuesta #13 en: 12 Noviembre 2011, 17:48 »

Ya he conseguido hacerlo, muchas gracias a todos por vuestra ayuda.

Saludos!
En línea
jamatbar

Desconectado Desconectado

Mensajes: 28


Ver Perfil
Re: Calculo de números primos
« Respuesta #14 en: 12 Noviembre 2011, 18:03 »

A ver, el programa me ha quedado así:

Código
#include <stdio.h>
 
int main ()
{
 int valor;
 int i;
 int flag = 1;//variable de control
 printf("Introduzca un valor:");
 scanf ("%d", &valor);//lee el número
 
 for (i=2; i < valor ; i++ )
   if (0 == (valor % i ))
     {//bucle que se repite hasta que i es igual a valor
flag = 0;
     }
 if (flag == 1)
   printf ("%d es un número primo\n", valor);
 else // en funcion del valor de flag se imprime una u otra cosa
   printf ("%d no es primo \n", valor);
 return 0;
}

Ahora me piden que: Para mejorar la eficiencia del programa, el bucle debe finalizar una vez encontrado el primer divisor. Para ello deberá hacer uso de la variable de control usada en el apartado anterior.

No lo entiendo, ¿se supone que el programa ya termina cuando encuentra un divisor no?

Saludos
En línea
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
rsa y numeros primos
Criptografía
sulivan 1 2,880 Último mensaje 11 Octubre 2009, 00:11
por astaroth7
Números Primos
Programación C/C++
alfilblanco 4 1,501 Último mensaje 24 Octubre 2009, 23:34
por baron.power
numeros primos u.u
Programación C/C++
Darioxhcx 4 1,994 Último mensaje 2 Diciembre 2009, 20:37
por nicolas_cof
[Python 2.6] Funcion generadora de Numeros primos (5.761.455 primos en 19 seg)
Scripting
katas 2 3,651 Último mensaje 10 Marzo 2010, 01:50
por Novlucker
NUMEROS PRIMOS
Programación C/C++
alviera 4 1,636 Último mensaje 7 Diciembre 2010, 06:39
por N0body
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines