bueno tengo un problema..
detecta si el numero ingresado NO es primo , pero no me puedo dar manija para que salte el print si ES primo..
no se si me hago entender
este es el codigo que tengo ;D
#include <stdio.h>
main () {
int ent,res,div,x,y,cont;
scanf("%d",&ent);
y=ent-1;//restandole 1 a el numero entero
for (x=2;x<=y;x++) {//haciendo el conteo de 2 a y
res=ent%x; //sacando el cociente entre ent y x ejemplo : 8 / 2 = 0
if (res==0) {
printf("%d NO es primo\n",ent);
}
}//cerrando FOR
fflush(stdin);
getchar();
}
el tema es que intente usar break; al final de
printf("%d NO es primo\n",ent);
pero tiene problemas a la hora de detectar algunos numeros
termina diciendo q 135 x ejemplo es primo xD
se que soy medio desprolijo en cuanto el codigo , pero yo me entiendo , no se ustedes :P
ahh y tal ves en la libreria math.h exista una forma mas sencilla de lograrlo , pero no lei , ademas me gusta romperme la cabeza un poco , pero esto me esta ganando ;D
alguna sugerencia ?
gracias
saludos
Prueba con esto:
#include <stdio.h>
main () {
int ent, res, x;
scanf("%d",&ent);
for ( x = 2;x < (int)(ent / 2);x++) {
res = ent % x;
if (res==0){
printf("%d NO es primo\n",ent);
x = ent + 1;
}
}
}
Conste que esto fue un poco mejorado, sobre todo en el for, en la condición para finalizar el ciclo.
Valga la aclaración que modificar la variable de un ciclo incondicionado, no es muy bien vista... así como tampoco un break. Lo ideal para este tipo de casos, según planteas la solución es aplicar un ciclo condicionado.
Y que pasa si ingreso el numero 1. Pwned!
Aqui otro modo de hacerlo, mostrando los numeros primos hasta el 1000
#include<stdio.h>
int main()
{
int i=0;
for(int num=2; num <= 1000; num++)
{
for(i = 2; num % i != 0 && i < (num-1); i++){};
if(num!=1 && num % i != 0 || num ==2)
printf("%d es primo\n",num);
}
getchar();
}
Falta mejorar el 2do for para disminuir el numero de iteraciones.
Eso es algo que debería preguntar al principio, por supuesto no se puede dar la solución concreta.
CitarAdvertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje
Lo mejor para esto es practicar con la criba de eratóstenes.
bool isPrime(unsigned int x)
{
if(x)
{
bool check = true;
for(int i = 2; i<x/2;i++)
if(!x%i)
check = false;
return check;
}
return false;
}
Si hago:
if(isPrime(8)) printf("es primo\n");
if(isPrime(4)) printf("es primo\n");
if(isPrime(5)) printf("es primo\n");
En todas devuelve que es primo :huh:
Como utilizas tu código??
Cita de: dr.~ en 17 Mayo 2010, 02:22 AM
Prueba con esto:
#include <stdio.h>
main () {
int ent, res, x;
scanf("%d",&ent);
for ( x = 2;x < (int)(ent / 2);x++) {
res = ent % x;
if (res==0){
printf("%d NO es primo\n",ent);
x = ent + 1;
}
}
}
Conste que esto fue un poco mejorado, sobre todo en el for, en la condición para finalizar el ciclo.
Valga la aclaración que modificar la variable de un ciclo incondicionado, no es muy bien vista... así como tampoco un break. Lo ideal para este tipo de casos, según planteas la solución es aplicar un ciclo condicionado.
gracias , recien empiezo con lo que es c , me faltan algunas cosas como funciones ,punteros y otras como pa poder tenerlo mas claro
Cita de: Alex@ShellRoot en 17 Mayo 2010, 02:34 AM
Y que pasa si ingreso el numero 1. Pwned!
una ves echo el codigo y funcionando , se evaluaria si es 1 y no pasaria a otra instancia , diciendo q es 1 es primo o se lo que sea ;D ya lo tenia en cuenta ;D
saludos
Cita de: Og. en 17 Mayo 2010, 02:54 AM
bool isPrime(unsigned int x)
{
if(x)
{
bool check = true;
for(int i = 2; i<x/2;i++)
if(!x%i)
check = false;
return check;
}
return false;
}
hay un pequeño error:
bool isPrime(unsigned int x)
{
if(x)
{
bool check = true;
for(int i = 2; i<x/2;i++)
if(!(x%i))
check = false;
return check;
}
return false;
}
de todas formas, no lo probé en profundidad, pero me hace que debería funcionar...
S2
Muy cierto lo que dijo karman, el ! tiene prioridad sobre % así que debe quedar !(x%i) en el if.