моя программа на C для поиска факториала не дает мне желаемого результата

#c

#c

Вопрос:

Вот мой код:

 #include <stdio.h>

void main() {
    int n, f = 1;
    printf("enter any number: ");
    scanf("%d", amp;n);
    while (n > 0) {
        f = f * n;
        n = n - 1;
    }
    printf("factorial of %d is %d", n, f);
}
 

И это дает мне результат:

введите любое число: 5
факториал от 0 равен 120

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

1. n в вашей программе снижается до нуля. Поэтому неудивительно, что печатается ноль.

2. По сути, вы печатаете свой счетчик, вместо того, чтобы печатать переменную для того, что вы читаете (поскольку вы изменили ее на несуществующую). Создайте переменную копирования или печатайте постепенно

3. Вы всегда должны проверять значение, возвращаемое scanf, даже в таких тривиальных случаях, как этот. Эта программа демонстрирует неопределенное поведение при вводе «foo».

4. Возможно, вы не захотите печатать 1, когда пользователь вводит отрицательное число.

Ответ №1:

Просто сохраните исходный ввод:

 #include<stdio.h>
void main()
{
    int n,n1,f=1;
    printf("enter any number: ");
    scanf("%d",amp;n1);
    n = n1;
    while(n>0)
    {
        f=f*n;
        n=n-1;
    }
    printf("factorial of %d is %d",n1,f);
}
 

Ответ №2:

Я бы предпочел использовать для этого цикл for. Это позволяет вам объявлять локальную переменную для цикла, которую вы можете инициализировать n , не влияя на значение n :

 #include <stdio.h>

int main(int argc, char *argv[]) {
    int n, f=1;

    printf("enter any number: ");
    scanf("%d",amp;n);

    for (int i=n; i>0; i--)
        f *= i;

    printf("factorial of %d is %dn", n, f);
}
 

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

1. Я уже успешно выполнил это с помощью цикла for, но я хочу сделать это с помощью цикла while

Ответ №3:

C имеет синтаксис, который позволяет вам определять новую переменную для вашего цикла, которая исчезнет после завершения вашего цикла. Это позволяет запускать цикл без изменения пользовательского ввода внутри цикла.

 scanf("%d",amp;n);
for (int i = n; i > 0; i--)
{
    f=f*i;
}
 

Некоторым людям for больше нравятся циклы, чем while циклы, потому что у них больше «структуры» — весь код, связанный с организацией циклов, находится в одной строке кода.

Ответ №4:

то, что вы делаете, это «n = n-1;» из-за этой строки значение n становится равным нулю в конце, поэтому сохраните значение n в какой-либо переменной, а затем напечатайте в последней

 #include<stdio.h>
void main()
{
int n,f=1, k;
printf("enter any number: ");
scanf("%d",amp;n);
k=n;// do this
while(n>0)
{
    f=f*n;
    n=n-1;
}
printf("factorial of %d is %d",k,f);
}
 

Ответ №5:

Поскольку вам нужно значение n после цикла, вы не должны изменять n его в while цикле, а использовать временную переменную i для перечисления факторов.

Также обратите внимание, что main() имеет возвращаемый тип int и возврат 0 при успешном выходе.

Вот модифицированная версия:

 #include <stdio.h>

int main() {
    int n, f = 1;
    printf("enter any number: ");
    if (scanf("%d", amp;n) == 1) {
        int i = n;
        while (i > 1) {
            f = f * i;
            i = i - 1;
        }
        printf("factorial of %d is %d", n, f);
    }
    return 0;
}
 

Ответ №6:

n всегда будет равно 0 в конце цикла while. Вы не можете напечатать старое значение, если используете n в качестве счетчика. Создайте отдельную переменную и используйте ее в качестве счетчика в цикле while.