Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: nenito_sevillista en 23 Noviembre 2010, 20:36 pm



Título: Programacion en C. Fallo codificar numeros primos
Publicado por: nenito_sevillista en 23 Noviembre 2010, 20:36 pm
Hola, podrían ayudarme y decimirme qué me falla en este codigo??
gracias.

Código:
void main(void)
{
/* DECLARACIÓN DE VARIABLES (Realice la tabla de objetos) */
int i;
int n;
int primo;
/* LECTURA DE DATOS */
printf("Introduzca un numero natural:");
scanf("%d",&n);
/* ALGORITMO DETERMINACIÓN NÚMERO PRIMO */
/*************INICIO CÓDIGO*****************/
i=2;
primo=0;
if(n%i==0)
{
         primo=primo+1;
         }
         else
         {
             i=i+1;
             }
           
             
/***************FIN CÓDIGO ******************/
/* ESCRITURA DE RESULTADOS */
if(primo==1) printf("El numero %d es primo",n);
if(primo==0) printf("El numero %d no es primo",n);
/* BLOQUEO DE PANTALLA*/
printf("\n");
system("pause");
}


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Mr.Blue en 23 Noviembre 2010, 20:46 pm
Código
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. /* DECLARACIÓN DE VARIABLES (Realice la tabla de objetos) */
  5. int i;
  6. int n;
  7.  
  8.  
  9. int primo;
  10. /* LECTURA DE DATOS */
  11. printf("Introduzca un numero natural:");
  12. scanf("%d",&n);
  13. /* ALGORITMO DETERMINACIÓN NÚMERO PRIMO */
  14. /*************INICIO CÓDIGO*****************/
  15. i=2;
  16. primo=0;
  17. if(n%i==0)
  18. {
  19. primo=primo+1;
  20. }
  21. else
  22. {
  23. i=i+1;
  24. }
  25.  
  26.  
  27. /***************FIN CÓDIGO ******************/
  28. /* ESCRITURA DE RESULTADOS */
  29. if(primo==1) printf("El numero %d es primo",n);
  30. if(primo==0) printf("El numero %d no es primo",n);
  31. /* BLOQUEO DE PANTALLA*/
  32. printf("\n");
  33. getchar ();
  34. return 0;
  35. }

No veo ninguna falla, de logica.
Por ahi te falto poner las librerias? o #include <windows.h> para system (PAUSE);
Sugerencias
Algunas cosas para tener encuenta es no usar la llamda al sistema para hacer pausa para eso tenes getchar ();, y la estuctura del main deberia ser int main () con un return al final como se ve ahi, para indicar si hubo un error o no.
declarar i =2; me parece al cohete jeje, pone
if (n%2==0) i es lo mismo y usas menos variables.
otra cosa, porq usar tantos if?

if (n%2==0)

puts ("es primo");

else puts ("no es primo");

y eliminas lineas de codigo

las declaraciones de variables puede ser asi tmb.

int i, n, primo;  separados por coma y punto y coma en la ultima variable declarada


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Beakman en 23 Noviembre 2010, 22:05 pm
Ahi no estas averiguando si el numero es primo.
Estas averiguando si el numero es par.

Para averiguar si es primo tenes que hacer un ciclo desde 1 hasta el numero ingresado y preguntar si es divisible por cada numero.


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Akai en 23 Noviembre 2010, 22:15 pm
tenes que hacer un ciclo desde 1 hasta el numero ingresado y preguntar si es divisible por cada numero.

Error, Desde 1 hasta el número/2. A partir de numero/2, ya no va a haber más divisores de él.


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Beakman en 23 Noviembre 2010, 22:19 pm
Código:
Error, Desde 1 hasta el número/2. A partir de numero/2, ya no va a haber más divisores de él.

Si, estaría de mas hacerlo hasta el numero.


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: piou en 23 Noviembre 2010, 22:41 pm
Ahí lo que estás mirando es si el número es divisible por 2. Me parece que querías hacer un bucle e ir subiendo, porque si no lo es le sumas 1 a la variable i, pero te has equivocado.
Tienes que hacer un bucle desde 2 hasta n/2, en cuanto el resto sea 0, activas un bool o algo y sales del bucle, porque significa que no es primo.


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Darioxhcx en 23 Noviembre 2010, 23:11 pm
Código:
#include <stdio.h>
int main () {
    int ini,cont,asd;
    printf("ingrese su numero ");
    scanf("%d",&asd);
    cont=asd-1;
    for (ini=2;ini<=cont;ini++) {
            if (asd%ini==0) { goto noprimo; }
            }
    printf("%d es primo",asd);
    getch();
    getchar();
    return 0;
    noprimo:
            printf("%d no es primo",asd);
            getch();
            getchar();
            return 0;
yo lo hice asi hace tiempo y me funciono


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Akai en 23 Noviembre 2010, 23:33 pm
Esto... Darioxhcx... permíteme que mejore un poco tu código.

Código
  1. #include <stdio.h>
  2. int main () {
  3.    int con=2,primo=1,numero;
  4.    printf("ingrese su numero ");
  5.    scanf("%d",&numero);
  6.    while(primo==1 && con < numero/2+1){
  7.        if(numero%con==0)
  8.            primo=0;
  9.        con++;
  10.    }
  11.    if(primo==1)
  12.        printf("%d es primo\n",numero);
  13.    else
  14.        printf("no es primo\n");
  15.    return 0;
  16. }
  17.  
¿Para qué usar getchar o system pause teniendo esto? -->
http://foro.elhacker.net/programacion_cc/ejecutar_programas_en_windows_sin_necesidad_de_pausas_system_pause_etc-t306837.0.html


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: do-while en 24 Noviembre 2010, 00:28 am
¡Buenas!

Realmente llegar hasta n/2 es perder el tiempo. El mayor de los divisores mas pequeños es la raiz cuadrada, ya que si un divisor sobrepasa la raiz cuadrada es porque el otro factor es menor que la raiz cuadrada:

Si a * b = c y a2 > c entonces b2 < c, ya que de lo contrario a2 * b2) > c * c = c2 y esto impllica, tomando raices, que a * b > c, lo cual es una contradiccion. Por lo tanto b2 < c lo que es lo mismo que b < c1/2

¡Saludos!


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: Beakman en 24 Noviembre 2010, 07:58 am
¡Buenas!

Realmente llegar hasta n/2 es perder el tiempo. El mayor de los divisores mas pequeños es la raiz cuadrada, ya que si un divisor sobrepasa la raiz cuadrada es porque el otro factor es menor que la raiz cuadrada:

Si a * b = c y a2 > c entonces b2 < c, ya que de lo contrario a2 * b2) > c * c = c2 y esto impllica, tomando raices, que a * b > c, lo cual es una contradiccion. Por lo tanto b2 < c lo que es lo mismo que b < c1/2

¡Saludos!
Claro. Esta bien de cualquiera de esas formas.

Igual no es un un super código. En ESTE caso creo que no influye mucho una cuenta mas o una cuenta menos.

 
Esto... Darioxhcx... permíteme que mejore un poco tu código.

Código
  1. #include <stdio.h>
  2. int main () {
  3.    int con=2,primo=1,numero;
  4.    printf("ingrese su numero ");
  5.    scanf("%d",&numero);
  6.    while(primo==1 && con < numero/2){
  7.        if(numero%con==0)
  8.            primo=0;
  9.        con++;
  10.    }
  11.    if(primo==1)
  12.        printf("%d es primo\n",numero);
  13.    else
  14.        printf("no es primo\n");
  15.    return 0;
  16. }
  17.  
¿Para qué usar getchar o system pause teniendo esto? -->
http://foro.elhacker.net/programacion_cc/ejecutar_programas_en_windows_sin_necesidad_de_pausas_system_pause_etc-t306837.0.html

ERROR:
Dice que 4 es un numero primo. y no lo es.


Este es mi codigo:
Código
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main()
  5. {
  6. int x; //para el ciclo
  7. int num;
  8. int con=0;
  9.  
  10. cout << "Ingrese numero: ";
  11. cin >> num;
  12. //aca se puede preguntar si el numero es 1
  13. //el 1 no es primo
  14. for( x=1;x<=num;x++ )
  15. if( num%x == 0 )
  16. con++;
  17.  
  18. if( con>2 )
  19. cout << "No es primo" << endl;
  20. else
  21. cout << "Si es primo" <<endl;
  22.  
  23. return 0;
  24. }
  25.  


Título: Re: Programacion en C. Fallo codificar numeros primos
Publicado por: do-while en 24 Noviembre 2010, 22:52 pm
¡Buenas!

En este caso si que infuye una cuenta mas que una menos. Una algoritmo es de orden O(n) y el otro de orden O(n1/2. Si tienes que s(n/k) = n/(kn1/2) y haces limite de s(n) en +infinito, te dara +infinito. Esto quiere decir que n crece mucho mas que n1/2, para numeros grandes, lo que significa que hacer comparaciones hasta la raiz cuadrada es mas eficiente que hacerlo hasta el mismo numero o hasta su mitad.

¡Saludos¡