Estoy tratando de verificar si el número proporcionado por el usuario es un número de Armstrong . Algo está mal y no puedo entenderlo.
Cualquier ayuda es apreciada.
Código adjunto a continuación.
#include int fun(int); int main() { int x,a,b,y=0; printf("enter the number you want to identify is aN ARMSTRONG OR NOT:"); scanf("%d",&a); for(int i=1 ; i<=3 ; i++) { b = a % 10; x = fun(b); y = x+y; a = a/10; } if(y==a) printf("\narmstrong number"); else printf("\nnot an armstrong number"); return 0; } int fun(int x) { int a; a=x*x*x; return (a); }
El problema principal es que no mantiene un registro del número con el que comienza. Dividimos a
por 10 repetidamente (termina como 0), y luego comparas 0 con 153. Estos no son iguales.
Su otro problema es que no puede buscar números de Armstrong de 4 dígitos o más largos, ni otros de 1 dígito que no sean 1. Su función fun()
llamaría mejor cube()
; en mi código a continuación, se le cambia el nombre a power()
porque está generalizado para manejar números de N dígitos.
Decidí que para el rango de potencias en cuestión, no era necesario utilizar un algoritmo más complejo para power()
, uno que se divide por dos, etc. Se ahorraría entre 6 y 10 dígitos, pero no se podía t medirlo en este contexto. Si se compiló con -DDEBUG
, incluye impresión de diagnóstico, que se usó para asegurarme de que mi código funcionaba correctamente. También tenga en cuenta que la respuesta hace eco de la entrada; Esta es una técnica básica para garantizar que está obteniendo el comportamiento correcto. Y he envuelto el código en una función para probar si un número es un número de Armstrong, que se llama iterativamente desde el progtwig principal. Esto hace que sea más fácil de probar. He agregado controles al scanf()
para evitar problemas, otra técnica de progtwigción básica importante.
He comprobado la mayoría de los números de Armstrong hasta 146511208 y parece correcto. Los pares 370 y 371 son intrigantes.
#include #include #ifndef DEBUG #define DEBUG 0 #endif static int power(int x, int n) { int r = 1; int c = n; while (c-- > 0) r *= x; if (DEBUG) printf(" %d**%d = %d\n", x, n, r); return r; } static bool isArmstrongNumber(int n) { int y = 0; int a = n; int p; for (p = 0; a != 0; a /= 10, p++) ; if (DEBUG) printf(" n = %d, p = %d\n", n, p); a = n; for (int i = 0; i < p; i++) { y += power(a % 10, p); a /= 10; } return(y == n); } int main(void) { while (1) { int a; printf("Enter the number you want to identify as an Armstrong number or not: "); if (scanf("%d", &a) != 1 || a <= 0) break; else if (isArmstrongNumber(a)) printf("%d is an Armstrong number\n", a); else printf("%d is not an Armstrong number\n", a); } return 0; }
Un problema podría ser que está cambiando a
(por lo que ya no tendrá el valor original). También solo coincidiría con 1, 153, 370, 371, 407
. Esa es una sugerencia para reemplazar el for y la prueba hasta que a
sea cero y cambiar la función para boost el número de dígitos.
#include #include int power(int, int); int numberofdigits(int); //Routine to test if input is an armstrong number. //See: http://en.wikipedia.org/wiki/Narcissistic_number if you don't know //what that is. int main() { int input; int digit; int sumofdigits = 0; printf("enter the number you want to identify as an Armstrong or not:"); scanf("%d",&input); int candidate = input; int digitcount = numberofdigits(input); for(int i=1 ; i <= digitcount ; i++) { digit = candidate % 10; sumofdigits = sumofdigits + power(digit, digitcount); candidate = candidate / 10; } if(sumofdigits == input) printf("\n %d is an Armstrong number", input); else printf("\n %d is NOT an Armstrong number", input); return 0; } int numberofdigits(int n); { return log10(n) + 1; } int power(int n, int pow) { int result = n; int i=1; while (i < pow) { result = result * n; i++; } }
Lo que estaba mal con el código:
int x,a,b,y=0;
es confuso, todas las variables se configuran en 0 o simplemente y
. Siempre ponga vars que se inicializan en una línea separada. Facilita la lectura. Haga un esfuerzo adicional para ser unívoco, se verá recompensado en el largo plazo. fun(x)
? Nunca nombres algo fun()
es como ciencia libre de hechos, ¿cuál es el punto? return (input == 153) || (input == 370) || ....
return (input == 153) || (input == 370) || ....
/* Name: Rakesh Kusum Email Id: rockykusum@gmail.com Title: Program to Display List of Armstrong Numbers in 'C' Language */ #include #include int main() { int temp,rem, val,max,temp1,count; int num; val=0; num=1; printf("What is the maximum limit of Armstrong Number Required: "); scanf("%d",&max); printf("\nSo the list of Armstrong Numbers Before the number %d are: \n",max); while(num <=max) { count = 0; temp1 = num; while(temp1!=0) { temp1=temp1/10; count++; } if(count<3) count = 3; temp = num; val = 0; while(temp>0) { rem = temp%10; val = val+pow(rem,count); temp = temp/10; } if(val==num) { printf("\n%d", num); } num++; } return 0; }
Marque No. es Armstrong o no está usando el lenguaje C
#include #include void main() { A: int n,n1,rem,ans; clrscr(); printf("\nEnter No. :: "); scanf("%d",&n); n1=n; ans=0; while(n>0) { rem=n%10; ans=ans+(rem*rem*rem); n=n/10; } if(n1==ans) { printf("\n Your Entered No. is Armstrong..."); } else { printf("\n Your Entered No. is not Armstrong..."); } printf("\n\nPress 0 to Continue..."); if(getch()=='0') { goto A; } printf("\n\n\tThank You..."); getch(); }