El progtwig para Armstrong Número de ‘n’ dígitos está dando una salida incorrecta por solo 153

Mi progtwig para verificar el número de ‘n’ dígitos de Armstrong está dando una salida incorrecta, solo cuando la entrada es 153.

Aquí está mi código.

#include #include int main() { int p, k, n, t, sum, n1, m; printf("Enter the number: "); scanf("%d", &n); n1=n; for(p=0, k=1; n/k>=1; ++p, k*=10); printf("\nThe number of digits: %d", p); for(sum=0; n>0; n/=10) { t= n%10; printf("\n\nThe base and power: %d and %d", t, p); m=pow(t, p); printf("\nThe calculated no is: %d", m); sum+=pow(t, p); printf("\nThe sum is: %d", sum); } printf("\n\t The original number is : %d", n1); printf("\n\t The calculated number is: %d", sum); if(n1==sum) printf("\n\t%d is an armstrong number\n", n1); else printf("\n\t%d is not an armstrong number\n", n1); return 0; } 

El progtwig obtiene 152 cuando hace los cálculos y, por lo tanto, da un resultado incorrecto. He impreso cada paso para encontrar el punto exacto de error.

  • He utilizado la función de potencia en lugar de bucles
  • No puedo usar t * t * t ya que este progtwig es para los números de Armstrong de “n” dígitos, y no solo 3
  • Estoy comstackndo el progtwig usando Code Blocks 16.01

El problema es que está calculando el cubo de 5 como 124 .

Es interesante que obtengo la respuesta correcta (125) cuando uso la función de potencia para calcular el cubo de 5 en un progtwig simple y separado.

También verifiqué el código dado aquí -> https://www.programiz.com/c-programming/examples/check-armstrong-number que también da el resultado incorrecto. Las respuestas a las preguntas similares que encontré en este sitio web no resolvieron el problema.

Bueno, no soy capaz de reproducir dicho problema. Obtengo el resultado correcto para la entrada 153, es decir, es un número de Armstrong.

Podría ser un error de redondeo de punto flotante debido al uso de pow (aunque me parece extraño en este caso específico).

Para una tarea como esta, no debe usar punto flotante. Utilice el tipo de entero más grande disponible. No solo evita errores de redondeo desagradables, sino que también aumenta el rango de valores de entrada que su progtwig puede manejar.

Por lo tanto, me gusta abordar esta parte:

No puedo usar t * t * t ya que este progtwig es para los números de Armstrong de “n” dígitos, y no solo 3

Puede escribir fácilmente una función que calcule t^n usando números enteros. Aquí hay un ejemplo:

 #include uint64_t intpow(uint64_t t, uint64_t p) { uint64_t result = 1; while(p>0) { result = result * t; --p; } return result; } 

Aviso: En su forma actual, la función carece de detección de desbordamiento ya que quería mantener la función simple.

Hay dos maneras de resolver. 1) Utilice la función round () que dará el número entero más cercano (porque hay algún error en el cálculo del punto flotante en los bloques de código).

2) Declare su variable de sum como flotante o doble porque entonces se convertirá en perfecta precisión de punto flotante.