Pregunta

No puedo hacer que funcione el siguiente código.

#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; 
}  

¿Cómo puedes hacer que el código funcione?

¿Fue útil?

Solución

AInitak dio la respuesta correcta, pero quiero agregar esa forma de hacerlo. encontrar el error en su código es imprimir los valores de i y x en el bucle factorial.

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

Esto te da la salida

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

Esto hace que sea más fácil ver qué va mal.El ciclo no termina donde se esperaba por las razones que explicó AInitak.

Otros consejos

Estás modificando la variable de terminación de bucle (x) dentro del bucle.Actualmente su código explota después de algunas iteraciones, cuando X desborda el rango de un entero de 32 bits y luego se vuelve negativo y muy grande, terminando así el ciclo.

Debería ser:

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

Mejor aún, deberías usar long en lugar de int para la variable x y el valor de retorno, porque ¡norte! se vuelve muy grande muy rápidamente.

Es un mal estilo en C omitir void al definir o declarar una función. Así que ponlo

int main(void)

Si bien no cambia nada sobre el número de parámetros que tiene la función (la función tiene cero parámetros sin ese <=> tampoco), declarará la función como una que acepta solo cero argumentos, mientras que no diga algo sobre la cantidad y los tipos de argumentos aceptados cuando omita el <=>. Sin embargo, ambas versiones con y sin <=> son correctas.

Lea esta respuesta sobre ese asunto también.

#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;

}

¿Qué mensaje de error recibes?

Primero, declare su función factorial antes main. Además, preste atención a la sangría correcta. Su declaración de función <=> es correcta, por cierto.

Sugeriría usar también el doble o sin signo largo para el cálculo factorial para poder calcular el mayor valor de la función factorial.

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

Una función no recursiva más elegante.

#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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top