Domanda

Non riesco a far funzionare il seguente codice.

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

Come puoi far funzionare il codice?

È stato utile?

Soluzione

AInitak ha dato la risposta giusta, ma voglio aggiungere che un modo in cui puoi trovare il bug nel tuo codice è stampare i valori di i e x nel ciclo fattoriale .

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

Questo ti dà l'output

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

Questo rende più facile vedere cosa non va. Il loop non si ferma dove ti aspetti per i motivi spiegati da AInitak.

Altri suggerimenti

Stai modificando la variabile di terminazione del loop (x) all'interno del loop. Attualmente il tuo codice esplode dopo alcune iterazioni, quando x supera l'intervallo di un numero intero a 32 bit e quindi diventa negativo e molto grande, quindi interrompendo il ciclo.

Dovrebbe essere:

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

Meglio ancora, dovresti usare long invece di int per la variabile x e il valore di ritorno, perché n! diventa molto grande molto rapidamente.

È un cattivo stile in C tralasciare void quando si definisce o si dichiara una funzione. Quindi inseriscilo in

int main(void)

Sebbene non cambi nulla del numero di parametri della funzione (la funzione ha zero parametri senza neanche <=>), dichiarerà la funzione come una che accetta solo zero argomenti, mentre non lo farà dire qualcosa sulla quantità e sui tipi di argomenti accettati quando si omette il <=>. Tuttavia, entrambe le versioni con e senza <=> sono corrette.

Leggi questa risposta anche su questo argomento.

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

}

Quale messaggio di errore viene visualizzato?

Prima di tutto, dichiara la tua funzione factorial prima main. Inoltre, prestare attenzione al rientro corretto. La tua dichiarazione di funzione <=> è corretta, comunque.

Suggerirei di usare anche il doppio o il segno senza segno per il calcolo fattoriale per poter calcolare il valore maggiore della funzione fattoriale.

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

Una funzione non ricorsiva più 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top