Buenas, he llegado al foro de rebote buscando otra cosa, y como siempre, uno tiene la mala costumbre de leerse lo que no busca por curiosidad y rebotar de sitio en sitio... Hasta llegar a remotos lugares xD.
No sabía lo que son los números perfectos, pero se me ocurren varias modificaciones en el código de Slackin (que personalmente me gusta más que el de jarr18 por no usar pow, es una función bastante pesada).
La primera es simple, la eliminación de una variable, "mul" y con ella la instrucción "mul=num%i;"
Código:
#include<stdio.h>
int main() {
int i, num, sum=0;
printf("Introduzca el numero que desea verificar si es perfecto: ");
scanf("%d", &num);
for(i=1; i<num; i++) {
if(num%i==0) {
sum+=i;
}
}
/*sum se compara sum con num, y no con mul */
if(sum==num){
printf("El numero %d es perfecto.\n", num);
}
else
printf("El numero %d NO es perfecto.\n", num);
return 0;
}
Después podríamos parar el bucle en la mitad, o bien parando en num/2+1 (operación no muy costosa), o bien declarando una variable de tipo int "parada" que sea num/2+1 para no realizar la división en cada iteración, puesto que sabemos que el mayor divisor de num va a ser su mitad.
Código:
#include<stdio.h>
int main() {
int i, num, sum=0, parada;
printf("Introduzca el numero que desea verificar si es perfecto: ");
scanf("%d", &num);
for(i=1, parada=num/2+1; i<parada; i++) {
/* O bien for(i=1; i<num/2+1; i++){ y no declarar "parada".*/
if(num%i==0) {
sum+=i;
}
}
/*sum se compara sum con num, y no con mul */
if(sum==num){
printf("El numero %d es perfecto.\n", num);
}
else
printf("El numero %d NO es perfecto.\n", num);
return 0;
}
En el return y demás no me meto, eso ya cuestión de gustos.