Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema de logica con un For....

Estas en el tema de Problema de logica con un For.... en el foro de C/C++ en Foros del Web. Saludos, les presento el siguiente ejercicio, El programa consiste en, dependiendo de la opcion que pulse el usuario, Sacar una lista de numeros primos o ...
  #1 (permalink)  
Antiguo 28/04/2011, 12:34
 
Fecha de Ingreso: enero-2011
Mensajes: 33
Antigüedad: 13 años, 11 meses
Puntos: 0
Pregunta Problema de logica con un For....

Saludos, les presento el siguiente ejercicio, El programa consiste en, dependiendo de la opcion que pulse el usuario, Sacar una lista de numeros primos o el factorial de un numero, El programa corre perfectamente:


#include<stdio.h>
#include<stdlib.h>
#undef abs
#define p printf
#define s scanf

int primos(int c)
{
int a,j,pr;
pr=1;
for(a=2 ; a<=c ; a++)
{
for(j=2 ; j<=a/2 ; j++)
if((a%j)==0)
pr=0;
if(pr)
p("\n%d\n",a);
pr=1;
}
}


long int factorial(long int num1)
{
if((num1==0) || (num1==1))
return 1;
else
return num1*factorial(num1-1);
}

main()
{
int op,num2;
long int num1;
do{
p("Introduzca Un Numero: \n");
s("%d",&num1);
if(num1<0){
printf("Error Debe de ser un numero Mayor a 0\n\n"); }
}while(num1<0);
num2=abs(num1);

do{
p("\n----Que desea hacer?---\n");
p("1. Serie de numeros primos del 1 al %d\n",num1);
p("2. Sacar Factorial de %d\n",num1);
p("3. Salir\n");
s("%d",&op);

switch(op)
{
case 1:
p("Esa Fue La Serie De Numeros Primos Del 1 al %d\n\n", num1, primos(num1));
system("pause");
case 2:
if(num2>50)
p("El valor es muy grande");
else
p("El factorial es: %d\n",factorial(num1));
}
}while(op!=3);
}

El problema de logica que tengo, es en cuanto a la primera funcion(Primos), El 2do for nunca se cumple, y ademas de eso, poniendo como caso que el usuario introdujera 50, el 2do for simplemente llegaria a 25 y alli se detendria, ayuda?... Como dije, el programa corre perfectamente y hace lo que debe, pero no entiendo como se ejecuta esa funcion...
  #2 (permalink)  
Antiguo 28/04/2011, 13:00
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años, 8 meses
Puntos: 24
Respuesta: Problema de logica con un For....

No entiendo muy bien la pregunta.

El resultado de factorial() es erroneo para valores de num>25 ya que el tipo int (y en la mayoría de los casos long tiene el mismo tamaño que simplemente int) no tiene suficiente capacidad para guardar el valor del factorial de 26.

Código:
num2=abs(num1);
esto me parece innecesario ya que solo aceptas números mayores de 0, por lo que abs no hace nada ahí.
__________________
Foros Desarrollo de Juegos
  #3 (permalink)  
Antiguo 28/04/2011, 13:14
 
Fecha de Ingreso: enero-2011
Mensajes: 33
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Problema de logica con un For....

Cita:
Iniciado por ssaammuu Ver Mensaje
No entiendo muy bien la pregunta.

El resultado de factorial() es erroneo para valores de num>25 ya que el tipo int (y en la mayoría de los casos long tiene el mismo tamaño que simplemente int) no tiene suficiente capacidad para guardar el valor del factorial de 26.

Código:
num2=abs(num1);
esto me parece innecesario ya que solo aceptas números mayores de 0, por lo que abs no hace nada ahí.
El problema es con el 2do for, "for(j=2 ; j<=a/2 ; j++)"... El primer for se realiza hasta el numero que el usuario introdujo(Ej: 50).... el 2do for nunca se cumple ya que en el primer for a=2 y 2/2=1, asi con TODOS los demas numeros.... y en caso de que lo hiciera no llegaria simplemente hasta 25(A/2)?
  #4 (permalink)  
Antiguo 28/04/2011, 13:52
 
Fecha de Ingreso: abril-2011
Mensajes: 88
Antigüedad: 13 años, 8 meses
Puntos: 24
Respuesta: Problema de logica con un For....

El segundo for, está dentro del primero.
Te recomiendo que uses sangrías y llaves para visualizar el código mejor.
Código C++:
Ver original
  1. int primos(int c){
  2.     int a,j,pr;
  3.     pr=1;
  4.  
  5.     for(a=2 ; a<=c ; a++){
  6.         for(j=2 ; j<=a/2 ; j++){
  7.             if((a%j)==0)
  8.             pr=0;
  9.         }
  10.         if(pr){
  11.             p("%d\n",a);
  12.         }
  13.         pr=1;
  14.     }
  15. }
La función sigue estos pasos
Empieza con pr=1 indicando que de momento el número es primo
Para cada número del 2 hasta el número deseado (c) [primer for]:
Para cada número del 2 hasta c/2 [segundo for]:
Si el número es factor pr=0, es decir, no es primo
Si es primo lo imprime

El c/2, es porque, un número no pude ser factor de un número que sea mayor de la mitas de este.

Si miras por ejemplo 10:
factores: 1, 2, 5
ningún número de 5 (10/2) va a poder ser factor de 10

Siento la mala explicación, pero espero que entiendas la lógica más o menos.
__________________
Foros Desarrollo de Juegos

Etiquetas: logica
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:20.