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:
#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:
#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
No sé si te servirá, pero yo hice este programa hace tiempo (aunque en él no uso "for"):
#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.
Gracias por la ayuda, aunque me piden que use una variable de control (flag), por eso no puedo ponerlo como tu lo tienes.
Saludos!
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
Cita de: $Edu$ en 12 Noviembre 2011, 15:02 PM
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
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
Aquí por si lo quereis primos, os dejo el codigo locos que escribe los primeros numeros primos, echadle un ojo.
#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;
}
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
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.
#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
#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.
Vale, leyendo más o menos lo que habeís puesto he hecho lo siguiente:
#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
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.
Perdon, me comí un par de líneas de código, ya lo he editado
Saludos
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:
#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
Ya he conseguido hacerlo, muchas gracias a todos por vuestra ayuda.
Saludos!
A ver, el programa me ha quedado así:
#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
Te recomiendo enormemente ponerle respectivas llaves a todas las instrucciones, más allá de que lleven una sola sentencia o no.
Ahora bien, no, ahí el programa sigue hasta terminar con el bucle for.
Para que termine cuando el flag lo indique o cuando llegue a terminar todas las repeticiones deberás usar otra estructura repetitiva (while o do-while) con 2 condiciones: Que el flag siga siendo falso y hasta que llegue al valor en cuestión.
ya mira, cuando haces el FOR, dices: "Declara una variable 'i' que inicie en dos(2) y que se aumente en 1(i++) mientras que sea menor a el valor de 'n'.".
Con esto haces que tu variable 'i' haga el recorrido desde el numero 2 hasta n.
Si vez bien el código que te puse usé la siguiente linea para el FOR:
for(int i=2; i < n && flag==0;i++)
Con esto digo: "Declara una variable 'i' que inicie en dos(2) y que se aumente en 1(i++) mientras que mi variable 'i' sea menor que 'n' y además que mi variable 'flag' sea sea exactamente igual a cero(0)".
Si te das cuenta en tu código haces un 'if' donde preguntas si el residuo de tu valor entre el valor que lleva la variable 'i' es cero(0), entonces cambie tu flag a 0, ese valor puedes utilizarlo en el for para que si 'flag' es distinto(!=) de cero(0) entonces continúe con la ejecución del for.
Saludos.
NO he visto las respuestas, pero dejo este video que ayuda mucho:
[youtube=600,400]http://www.youtube.com/watch?feature=player_embedded&v=FU1hi6cSpjQ[/youtube]
Hola
Además el bucle se podría acortar hasta la mitad:
for(int i=2; i <= n/2 && flag==0;i++)
Saludos
te hice un video rápido para ver si te puedo ayudar.
[youtube=425,350]http://www.youtube.com/watch?v=t3zY9IXOxzU[/youtube]
Saludos.
No se puede utilizar dentro del if el break; y ya ? xD
Terminara el for y continuara :silbar:
si, pero el está pidieron que utilicemos un flag. Así que hay que cumplir con sus exigencias xD.
Saludos.
Gracias a todos por vuestras ayudas, y hombre, no son exigencias, es que básicamente me lo piden con eso XD
Mi código ha quedado así:
#include <stdio.h>
int main()
{
int valor;
int i;
int flag = 1;
printf("Introduzca un valor: ");
scanf(" %d", &valor);
for ( i = 2; i < valor && flag!=0; i++ )
if (0 == (valor % i))
{flag = 0;
}
if (flag == 1)
printf(" %d es primo\n", valor);
else
printf(" %d no es primo\n",valor);
return 0;
}
Pero ahora me piden que una vez comprobado que el dos no es divisor, probar sólo con los números impares.
EDITO poniendo lo que he intentado:
#include <stdio.h>
int main()
{
int valor;
int i;
int flag = 1;
printf("Introduzca un valor: ");
scanf(" %d", &valor);
for ( i = 2; i < valor && flag!=0; i+=2 )
if (0 == (valor % i))
{flag = 0;
}
if (flag == 1)
printf(" %d es primo\n", valor);
else
printf(" %d no es primo\n",valor);
return 0;
}
¿Con eso bastaría no?
Saludos
No porque si revisas el bucle te daras cuenta que solo estas dividiendo entre los numeros pares mientras que el enunciado te pide revisar la serie 2, 3, 5, 7, ... N.
Un problema con el (debido a esa serie) es que debes manejar el caso especial donde el numero es par, si es dos es primo, cualquier otro no lo es.
Con los cambios:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int numero;
int i;
int es_primo;
printf("Introduce el numero: ");
fflush(stdout);
if (scanf("%d", &numero) != 1 || numero < 2)
return EXIT_FAILURE;
es_primo = numero == 2 || numero % 2 == 1;
for (i = 3; i < numero && es_primo; i += 2)
if (numero % i == 0)
es_primo = 0;
if (es_primo)
printf("%d es primo\n", numero);
else
printf("%d no es primo\n", numero);
return EXIT_SUCCESS;
}
Un saludo
Hola,
si nos ponemos a hacer código, cuando mejor sea mejor, no?
para saber si es un número es primo, no hay que llegar a dividirle entre todos los numeros anteriores a ese número para saberlo, por una demostración algebraica, que no me voy a para a explicar, con probar hasta la raíz cuadrada de ese mismo número es suficiente (raíz cuadrada inclusive, así que hace falta sustituir el menor por un menor o igual en el for).
ahora, para saber la raíz cuadrada de un número hace falta importar la biblioteca math.h, además de tener en cuenta al compilar, poner la opción "-lm", con lo que un ejemplo de compilación puede ser:
gcc -lm -o prueba prueba.c
y el programa quedaría de la siguiente manera:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
int numero;
int i;
int es_primo;
printf("Introduce el numero: ");
fflush(stdout);
if (scanf("%d", &numero) != 1 || numero < 2)
return EXIT_FAILURE;
es_primo = numero == 2 || numero % 2 == 1;
for (i = 3; i <= sqrt(numero) && es_primo; i += 2)
if (numero % i == 0)
es_primo = 0;
printf("%d %s primo\n", numero, (es_primo)?"es":"no es");
return EXIT_SUCCESS;
}
Saludos
¡Buenas!
Puestos a liarla:
#include <stdio.h>
int main(void)
{
int numero;
int i;
int es_primo;
printf("Introduce el numero: ");
fflush(stdout);
while(!scanf("%d", &numero))
while(getchar() != '\n');
for (es_primo = (numero > 1 && (numero == 2 || numero % 2 == 1)) , i = 2 ; i * i <= numero && (es_primo = (numero % i != 0)); i++);
printf("%d %s primo\n", numero, es_primo ? "es" : "no es");
return 0;
}
XD
¡Saludos!
Hay que tener cuidado al utilizar el valor de retorno de scanf:
while(!scanf("%d", &numero))
while(getchar() != '\n');
En caso de error o fin de archivo la funcion retorna EOF, eso causaria la salida del bucle con el valor de la variable "numero" como (todavia) "no definido" o "basura".
Un saludo