Программа на языке Си, которая умножает числа от 1 до N

#c

#c

Вопрос:

Я пытаюсь написать программу, которая умножает все числа от 1 до N , где N это число, введенное пользователем.

Например, если я ввожу 5 , я хочу, чтобы программа умножала каждое число от 1 до 5 .

Программа будет вычислять 1 * 2 * 3 * 4 * 5 = 120 .

Я новичок в C и программировании в целом, но мне удалось написать этот код, который делает что-то похожее на то, что я хочу.

 #include<stdio.h>

int main(void)
{
    int N, rem, prod = 1;

    printf("Enter the value of N: ");
    scanf("%d", amp;N);

    while(N != 0)
    {
        rem = N % 10;
        prod *= rem;
        N /=  10;
    }

    printf("%d", prod);

    return 0;
}
  

Мой код умножает каждое число друг на друга, но пользователь должен вводить каждое из них вручную.

Например, если бы я хотел получить результат, о котором я упоминал ранее, мне пришлось бы ввести 12345 .

Вместо этого я хотел бы ввести просто 5 .

Я был бы признателен за некоторые рекомендации по этому поводу.

Комментарии:

1. Почему ваш код вычисляет напоминание ( rem )?

2. Какое наибольшее N значение может быть введено?

3. Это называется «факториал», и по этому поводу возникает множество вопросов.

4. Я не думал о наибольшем числе для N, которое может быть введено. Однако для моих целей нормально, что я использую int для N, поскольку мне это не понадобится для таких больших чисел.

5. Я не знал, как это называется, поэтому мне было трудно найти другие сообщения с этой проблемой.

Ответ №1:

Вам понадобится что-то вроде:

 for(int i = 2; i <= N; i  ){
    prod *= i;
}
  

Live demo

Имейте в виду, что значение if N достаточно велико prod , что в конечном итоге приведет к переполнению.

Максимальное значение an int обычно 2 147 483 647 равно 2 31-1. Для этого предельного значения 12 будет максимально N возможным.

Вы могли бы растянуть это до 20 , если используете long long вместо int .

Верхний предел a long long равен, по крайней мере 9 223 372 036 854 775 807 , 2 63-1.

Для завершения вам следует проверить возврат scanf , чтобы убедиться, что входные данные были правильно проанализированы, например:

 if(scanf("%d", amp;N) == 1){
    //Ok, input parsed
}
else{
    //input not parsed
}
  

Комментарии:

1. ПОДСКАЗКА: имейте в виду, что C не имеет точных размеров для типов данных. Таким образом, int МОЖЕТ быть 32-разрядным. Но это также может быть 16, 64 или любой другой размер бит -> В основном зависит от компилятора и / или вашей целевой платформы.

2. @hiddenAlpha, в основном правильно, вот почему используется слово «обычно». Когда вы говорите «или любые биты по размеру», это не совсем точно, int должно быть не менее 16 бит.