Programación General > C/C++
Numeros perfectos
SkullFlower:
Hola,
quiero hacer un programa que le introduzcan cuantos numeros perfectos quiere que el programa saque por ejemplo si pones un 1 pues va a imprimir solo el primer numero perfecto y si pones 2 pues los primeros 2 numeros perfectos y asi sucesivamente.
Mi problema es que por ejemplo si pongo que calcule 1 saca el primer numero perfecto y sigue sacando los que siguen, tambien pasa lo mismo si pongo que calule 2 y con cualquier otro numero.
este es el codigo que tengo hasta ahorita:
--- Código: C ---#include<stdio.h>void perfecto(int x);int main(){ int y, x; printf("Introduzca cuantos numeros perfectos quiere: "); scanf("%d", &x); while(x >= 1){ for(y = 1; ;y++){ perfecto(y); x--; } } return 0;} void perfecto(int x){ int sum = 0, y; for(y = 1; y < x/2+1; y++){ if(x % y == 0){ sum += y; } } if(sum == x){ printf("%dn", x); }}
Aprendiz21Sam:
Vamos a analizar tu código.
Lo primero que veo es que tu procedimiento utiliza las variables "y", "x". Esto es muy peligroso a la hora de usarlas porque el mínimo descuido supone que el programa se ejecute de forma no deseada.
--- Código: C ---void perfecto(int x); (Esta es tu función, y le estás pasando "x").
--- Código: C# ---while(x >= 1){ for(y = 1; ;y++){ perfecto(y); x--; } }
Aquí estás pasando (y) y luego en el procedimiento la vuelves a definir. Aquí juegas con fuego porque te repites con las variables.
Esto son unas pistas, intenta solucionarlo y si no lo consigues escribe los nuevos problemas que tienes y te iré dando más pistas. Luego te pondré explícitamente en qué estás fallando pero ahora trata de ordenar tu programa para verlo todo mejor.
EI: juntando mensajes, usa el boton Modificar por favor.
Fíjate en este código. Como verás esta mas estructurado y tiene mayor facilidad de lectura. Este programa funciona perfectamente. Intenta averiguar cuáles son las diferencias y en qué te equivocaste. Si no lo encuentras vuelve a preguntar y te diré tus fallos, pero intenta pensarlo tú mismo.
--- Código: C ---/*Bibliotecas de C*/#include <stdio.h>#include <conio.h> /*Declaración de mis funciones*/int es_perfecto (int N); /*Programa principal*/int main(){ /*Declaración de las variables*/ int X; int N; int pares=0; /*Petición de datos*/ printf("Introduce el numero de numeros perfectos que quieres averiguar: "); scanf ("%d", &X); /*Algoritmo principal*/ for(N=2; pares!=X; N++) { if(N%2==0 && es_perfecto(N)) { printf("%d ", N); pares++; } } getch(); return 0;} /*Realización de la función*/int es_perfecto (int N) { int suma = 0; int i; for(i=1; i<=(N/2); i++) if(N%i==0) suma += i; if(suma==N) return 1; return 0; /* el "else" no hace falta */ }
SkullFlower:
hola gracias por responder :D
estaba viendo el codigo que pusiste y en la funcion:
--- Código: C ---int es_perfecto (int N){ int suma = 0; int i; for(i=1; i<=(N/2); i++) if(N%i==0) suma += i; if(suma==N) return 1; return 0; /* el "else" no hace falta */}
veo que no pones las llaves en los ifs ni en el for, es lo mismo si las pongo o no?
otra cosa:
--- Citar ---Lo primero que veo es que tu procedimiento utiliza las variables "y", "x". Esto es muy peligroso a la hora de usarlas porque el mínimo descuido supone que el programa se ejecute de forma no deseada.
--- Fin de la cita ---
por que dices eso?
Aprendiz21Sam:
Yo siempre pongo las llaves para verlo mejor. En este caso no las puse porque tenía un poco de prisa pero hay que ponerlas. El único momento donde no hace falta poner las llaves es cuando dentro de el "if" or de un bucle sólamente hay una instrucción.
Por ejemplo.
--- Código: C ---if (x > 3) x = 2
--- Código: C ---if (x > 3){ x = 2}
En este caso ambas están bien.
--- Código: C ---if (x > 3) x = 2 suma = suma + x
--- Código: C ---if (x > 3){ x = 2 suma = suma + x}
En este caso no significan lo mismo. Y si lo que quieres hacer es la segunda la primera estaría mal, porque dentro del if sólo entraría la primera instrucción "x = 2".
Lo de las variables digo que es peligroso por cuestiones de ámbito. Tú no estás haciendo un único algoritmo, sino que dentro de ese algoritmo estás utilizando funciones (que son subalgoritmos) y mezclar variables globales con variables locales, así como confundir los parámetros formales puede hacer que tu programa se vea afectado. Se pueden usar pero hay que tener cuidado.
Yo te recomiendo que crees tus propias variables dentro del subalgoritmo, y que las variables que pases a un subalgoritmos las nombres con "f_" delante del nombre.
Por ejemplo, si tienes una variable que se llama x (en el programa principal), y se la vas a pasar a una función, en la cabecera y en la implementación de la función pongas "f_x", osea (int subalgoritmo (f_x);) en vez de (int subalgoritmo (x);).
Espero que te sirva de ayuda.
SkullFlower:
Hola de nuevo.
Tratare de ya no usar las mismas variables para la proxima.
Batallo mucho haciendo ese tipo de programas y aveces mejor no los hago y ahora tengo que hacer un programa parecido pero con numeros primos.
si batallo mucho haciendo este tipo de programas significa que no sere buen programador? XD
otra cosa:
--- Código: C ---if(N%2==0 && es_perfecto(N))
esa parte no la entendi muy bien, me la podrias explicar?
y por ultimo:
Usando tu codigo puse que calculara 5 numeros y los primeros los muestra y ya despues se queda asi y no muestra el quinto, segun wikipedia el numero que sigue es el 33550336. Sera que el programa todavia no llega a ese numero?(ya lleva como 10 ~ 15 min ejecutado).
Navegación
[#] Página Siguiente
Ir a la versión completa