Невозможно заставить факториальную функцию работать на C

StackOverflow https://stackoverflow.com/questions/843188

  •  20-08-2019
  •  | 
  •  

Вопрос

Я не могу заставить следующий код работать.

#include <stdio.h>

// I am not sure whethere I should void here or not.
int main() {
    // when the first bug is solved, I put here arg[0]. It should be
    // similar command line parameter as args[0] in Java.
    int a=3;                  
    int b; 
    b = factorial(a);

    // bug seems to be here, since the %1i seems to work only in fprintf
    printf("%1i", b);
    return 0;      
}  

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

Как вы можете заставить код работать?

Это было полезно?

Решение

АЙнитак дал правильный ответ, но я хочу добавить, что одним из способов вы можете Найти ошибка в вашем коде заключается в распечатке значений i и x в факториальном цикле.

int factorial(int x) {
    int i;
    for(i=1; i<x; i++)
    {
        x *= i;
        printf("%d, %d\n", i, x);
    }
    return x;
}

Это дает вам результат

1, 3
2, 6
3, 18
4, 72
5, 360
6, 2160
7, 15120
8, 120960
9, 1088640
10, 10886400
11, 119750400
12, 1437004800
13, 1501193216
14, -458131456
-458131456

Это облегчает понимание того, что происходит не так.Цикл не останавливается там, где вы ожидаете, по причинам, объясненным Айнитаком.

Другие советы

Вы изменяете свою переменную завершения цикла (x) внутри цикла.В настоящее время ваш код завершает работу после нескольких итераций, когда x переполняет диапазон 32-битного целого числа, а затем становится отрицательным и очень большим, следовательно, завершая цикл.

Это должно быть:

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

А еще лучше, вы должны использовать long вместо того , чтобы int для переменной x и возвращаемое значение, потому что н! становится очень большим и очень быстро.

Это плохой стиль в C - не учитывать void при определении или объявлении функции.Так что вложи это в

int main(void)

Хотя это ничего не меняет в количестве параметров, которыми обладает функция (функция имеет нулевые параметры без этого void либо), он объявит функцию как такую, которая принимает только нулевые аргументы, в то время как он ничего не сообщит о количестве и типах принятых аргументов, если вы опустите void.Однако обе версии с и без void являются правильными.

Читать этот ответ и по этому поводу тоже.

#include<stdio.h>

#include<stdlib.h>

int main(int c,char *v[])

{

    int x,y;

    int *num;

    if(c==1)

    {

    printf("Usage : programName : number");

    return 0;

    }

    num=(int *)malloc(sizeof(int));

    *num=atoi(v[1]);

    x=1;y=1;

    while(x<=*num)

    {

    y=y*x;

    x++;

    }

    printf("Factorial of %d is %d ",*num,y);

    free(num);

    return 0;

}

Какое сообщение об ошибке вы получаете?

Во-первых, объявите свою функцию factorial до того , как main.Также обратите внимание на правильный отступ.Ваше объявление функции main кстати, это правильно.

Я бы предложил также использовать double или unsigned long для вычисления факториала, чтобы иметь возможность вычислять большее значение факториальной функции.

double fact( double n)
{
   if ( n == 1)
        return 1;
   return n*(fact(n-1));
}

Более элегантная нерекурсивная функция.

#include<stdio.h>
long long int fact(long long int);

long long int fact(long long int n){
    long long int num = 1;
    long long int fi = 0;
    for(long long int i=2;i<=n;i++){
        for(long long int j=1;j<=i;j++){
            fi += num;      
        }
        num = fi;
        fi = 0;
    }       
return num;
}    
int main(){
    long long int n;
    scanf("%lld",&n);
    printf("%lld\n",fact(n));
return 0;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top