почему моя функция выводит неправильно? - PullRequest
0 голосов
/ 27 марта 2020

Я создал функцию факториала, и мой вывод для целого числа b неверен, когда он установлен на 5, есть идеи, почему? b должно быть равно целому числу 120, и я получаю число -95449088 после того, как я скомпилирую и запусту его.

#include <stdio.h>
#include <stdlib.h>

int factorial(int x) 
{
    int i;
    for(i=1; i < x; i++)
    x *= i;
    return x;
}

int main() {
    int a=5, b;
    b = factorial(a);
    printf("%d\n", b);
}

Ответы [ 3 ]

4 голосов
/ 27 марта 2020

Чувак Попробуйте это один раз, надеюсь, вы получите правильный результат из этого кода.

#include <stdio.h>
#include <stdlib.h>

int factorial(int x) 
{
 int a=1,i;
 for(i=1; i<=x; i++)
 a*= i;
 return a;
}

int main()
{
 int a=5, b;
 b = factorial(a);
 printf("%d\n", b);
}

Этот код работает правильно. Надеюсь, это поможет вам.

3 голосов
/ 27 марта 2020

Здесь вы используете то же самое значение x в проверке состояния for-loop, что является ошибкой. Вместо этого вы можете сохранить переменную x в переменной temp и использовать эту переменную temp для проверки условия.

См. Ниже исправленный код

#include <stdio.h>
#include <stdlib.h>

int factorial(int x) 
{
    int i,temp=0;
    temp = x; //store the x to temp
    for(i=1; i < temp; i++){ 
        x *= i;
    }
    return x;
}

int main() {
    int a=5, b;
    b = factorial(a);
    printf("%d\n", b);
}
2 голосов
/ 27 марта 2020

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

Но это особый случай, и здесь вы можете повторно использовать входное значение при условии, что вы используете уменьшающуюся l oop:

int factorial(int x)
{
    int i;
    for (i = x-1; i >1; i--)
        x *= i;
    return x;
}

Это работает, потому что неявно инициализирует возвращаемое значение с x, а затем умножает его на все числа под ним, что является возможным определением для факториала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...