В программе, чтобы определить, является ли данное число числом Армстронг, я сохранил входной номер (3 цифры) в виде строки, как показано ниже.
char input[10];
scanf("%s",&input);
Теперь мне нужно вычислить куб каждой цифры, используя метод pow из math.h следующим образом.
int a;
a = pow(input[0],3);
Кодируя так, я не мог получить правильный результат. Если я напечатаю значение «а», он покажет какой-то несущественный ответ. Я сомневаюсь, как преобразовать строковое значение в целочисленное?





Вам не нужно получать адрес массива input с помощью &input. Простая передача input передаст указатель на вашу строку функции scanf (). Ваш вызов scanf () должен выглядеть так:
scanf("%s", input);
Другой способ сделать это с адресом оператора:
scanf("%s", &input[0]);
Для типов массивов получение адреса эквивалентно взятию адреса первого элемента, то есть & input == & input [0] == (char *) input
Вы выполняете свои вычисления для значения ASCII цифры. Вам нужно будет преобразовать его в числовое значение, например:
int digit = input[0] - '0';
int a; a = pow(digit, 3);
Мне нравится раздельное определение и объявление файла.
Есть две проблемы, обе уже подробно описаны. Во-первых, вашему scanf нужен char *, а не char **. Исправьте это тем, что сказал Джереми:
scanf("%s", input);
Затем правильно рассчитайте мощность, как сказал Адам:
a = pow(input[0]-'0',3);
Я продолжаю комментировать каждый ответ, смешивая их: char input [10]; & ввод - char () [10] и НЕ символ * :)
выполнение (& input) [1] будет указывать за весь массив, но выполнение (& input [0]) [1] будет указывать на второй его элемент. видите, это много разных вещей!
здесь тоже. если вы собираетесь изменить этот ответ, я за вас. если за него и дальше будут голосовать, я буду отрицать, потому что я думаю, что мы должны быть точными в stackoverflow :)
С другой стороны, вам может потребоваться заменить power на более общий, например power = strlen (input)
поэтому код должен выглядеть так.
char input[10];
int power, sum = 0;
scanf("%s", input);
power = strlen(input);
sum += pow(input[0] - '0', power);
/* you need to compare in here */
Конечно, должен быть цикл вокруг строки «сумма + = ...».
Дох, возможно, я провел слишком много времени вдали от C, потому что я думаю, что большинство ответов здесь упускают из виду конечную цель ... Совет по удалению &, конечно, прекрасен, но есть несколько других проблем с scanf.
Во-первых, это должно быть нормально для выброса кода / домашнего задания, но это опасно: введите 11 символов и получите переполнение буфера.
Во-вторых, IIRC, поскольку вам нужно число, вы должны использовать переменную int и получить его. Непроверенный код из ржавого ума:
int inputNumber;
scanf("%d", &inputNumber);
Здесь вам нужен &, потому что у вас больше нет указателя. C должен выполнить преобразование за вас, и у вас будет более безопасный ввод.
Другой проблемный код:
int a = pow(input[0], 3);
Вы делаете математику не с первой цифрой, а со значением Ascii первой цифры! Т.е. 49 для 1, 50 для 2 ...
Поскольку вы получили число из моей предыдущей поправки, разделите его на правильную степень 10, чтобы получить цифру.
Если вы предпочитаете использовать строковый маршрут, используйте хотя бы input[0] - '0'.
Кодирование от руки, основанное на идее @ PhiLho использовать фактический целочисленный ввод:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a, sum, i;
printf("Enter an Armstrong number, an integer in the range 100..999:\n");
if (scanf("%d", &a) != 1)
return EXIT_FAILURE;
if (a < 100 || a > 999)
return EXIT_FAILURE;
/* Now extract digits, and compute sum of cubes. */
for(sum = i = 0; i < 3; i++)
{
sum += pow(a % 10, 3);
a /= 10;
}
printf("sum is: %d\n", sum);
return EXIT_SUCCESS;
}
Числа Армстронга - это числа, которые демонстрируют свойство Армстронга в любой системе, а не только в базе 10.
int isArmstrong(int n, int b)
{
int sum = 0;
int n2 = n;
int nDigits = 0;
while(n2 != 0)
{
nDigits++;
n2 /= b;
}
n2 = n;
for(int i = 0; i < nDigits; i+++)
{
sum += pow(n2 % b, nDigits);
n2 /= b;
}
return sum == n;
}
Ваш код - это ожидаемое переполнение буфера. Избегайте использования scanf (), который с радостью перезапишет ваш стек, если пользователь введет что-либо, содержащее более 9 цифр / символов.