Основная проблема заключается в том, что вы не ведете запись числа, с которого начинаете.Вы делите a
на 10 несколько раз (это заканчивается как 0), а затем сравниваете 0 с 153. Они не равны.
Ваша другая проблема заключается в том, что вы не можете искать 4-значный или более Армстронгчисла, ни для однозначных, кроме 1. Ваша функция fun()
будет лучше названа cube()
;в моем коде ниже он переименован в power()
, поскольку он обобщен для обработки N-значных чисел.
Я решил, что для рассматриваемого диапазона степеней нет необходимости использоватьболее сложный алгоритм для power()
- тот, который делит на два и т. д. Было бы сэкономлено 6-10-значное число, но вы не могли бы измерить его в этом контексте.Если скомпилировано с -DDEBUG
, оно включает диагностическую печать, которая использовалась, чтобы убедить меня, что мой код работает правильно.Также обратите внимание, что ответ повторяет ввод;это основная техника, обеспечивающая правильное поведение.И я обернул код в функцию, чтобы проверить, является ли число числом Армстронга, которое вызывается итеративно из основной программы.Это облегчает тестирование.Я добавил проверки к scanf()
, чтобы предотвратить проблемы, еще одну важную базовую технику программирования.
Я проверил большинство чисел Армстронга до 146511208, и это кажется правильным.Пара 370 и 371 интригуют.
#include <stdio.h>
#include <stdbool.h>
#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;
}