Problema al determinar si un número es un Número de Armstrong

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:

  1. No se usan nombres de variables significativos , lo que hace que el significado del código sea difícil de entender; Recuerda que el código está escrito para humanos, no para comstackdores.
  2. No use el código confuso este 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.
  3. Use comentarios: si no sabe qué es un número de Armstrong, será muy difícil distinguirlo de su código. Ponga algunos comentarios significativos para que la gente sepa lo que su código debe hacer. Esto lo hará más fácil para usted y para los demás, ya que saben lo que quería hacer y pueden ver lo que realmente hizo y resolver la diferencia si es necesario.
  4. usar nombres significativos de rutina WTF hace fun(x) ? Nunca nombres algo fun() es como ciencia libre de hechos, ¿cuál es el punto?
  5. No codifique cosas , su rutina solo aceptará números de armstrong3, pero si puede codificar, ¿por qué no 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(); }