Я просто пробовал код, позволяющий определить, является ли число номером Армстронга или нет. Но он получал одинаковый результат для всех входов, даже если это число Армстронга. Поэтому я использовал онлайн-компилятор, и он сработал.
#include <stdio.h>
#include <math.h>
int main() {
int originalNum, num, lastDigit, digits, sum;
/* Input number from user */
printf("Enter any number to check Armstrong number: ");
scanf("%d", &num);
sum = 0;
originalNum = num;
/* Calculate the number of digits in the input number */
for (digits = 0; originalNum > 0; digits++) {
originalNum /= 10;
}
originalNum = num;
/* Compute the sum of the cubes of individual digits */
while (originalNum > 0) {
lastDigit = originalNum % 10;
sum += pow(lastDigit, digits);
originalNum /= 10;
}
/* Check if the sum equals the original number */
if (sum == num) {
printf("%d is an Armstrong number.\n", num);
} else {
printf("%d is not an Armstrong number.\n", num);
}
return 0;
}
Первоначально я допустил ошибку, полагая, что число Армстронга — это число, равное сумме кубов его цифр (независимо от количества цифр). Это было неправильно. Я соответствующим образом исправил свой ответ ниже.
В этой строке:
sum += pow(lastDigit, digits);
Вы используете pow
, которая является функцией для значений с плавающей запятой, а не целых чисел. Дополнительную информацию см. здесь: Странное поведение функции pow.
Вместо этого вам следует использовать возведение в степень на основе целых чисел. В этом посте предлагается эффективный способ сделать это с помощью следующей функции:
int ipow(int base, int exp)
{
int result = 1;
for (;;)
{
if (exp & 1)
result *= base;
exp >>= 1;
if (!exp)
break;
base *= base;
}
return result;
}
А потом:
sum += ipow(lastDigit, digits);
Примечание:
вам следует проверить возвращаемое значение scanf
(в вашем случае должно быть 1), чтобы убедиться, что вы ввели правильный ввод.
Это решение сработало на компьютере моего друга, но не на мне :(
Вы уверены ? Кажется, он работает безупречно в моей среде. Может быть, вы можете попытаться отладить это. См.: Как отлаживать небольшие программы. Какое меньшее число дает неверный результат (поэтому я попытаюсь воспроизвести проблему)?
Я думаю, что у меня проблема с моим компилятором, потому что он работал в другой системе.
Я не понимаю. Можете ли вы дать больше информации, чтобы я постаралась помочь? Также укажите наименьшее значение, для которого вы получите неверный результат. Я хотел бы убедиться, что я получу правильный вариант в своей среде.
Почему вы игнорируете возвращаемое значение
scanf()
?