Linguaggio C: triangolo di Tartaglia

scriccias
Ho fatto questo progetto per il calcolo del triangolo di Tartaglia:


main.c
#include <stdio.h>
#include <stdlib.h>
#include "Calcoli.h"

/*Letto in input il massimo livello voluto si stampi il triangolo di tartaglia fino a quel livello*/

int main()
{
	long int liv, n, k, triang;
	printf("Inserisci il livello del triangolo di Tartaglia: \n");
	scanf("%d", &liv);
	printf("\nIl triangolo di Tartaglia e' il seguente: \n");

	for (n = 0; n < liv; n++)
	{
		printf("Livello %d: ", n + 1);
		for (k = 0;k <= n;k++)
		{
			
			printf("%ld ", coefbin(n, k));
		}
		printf("\n");
	}

	system("PAUSE");
	return 0;
}



Calcoli.h
long int fattoriale(long int x);
long int coefbin(long int n, long int k);



Calcoli.c
long int fattoriale(long int x)
{
	long int f;

	if (x == 0)
	{
		f = 1;
	}
	else
	{
		f = x*fattoriale(x - 1);
	}
	return f;
}

long int coefbin(long int n, long int k)
{
	long int cb;
	cb = (fattoriale(n)) / ((fattoriale(k))*(fattoriale(n - k)));
	return cb;
}


Cercando su internet ho visto che il procedimento dovrebbe essere corretto quindi non mi riesco a spiegare come mai il calcolo del triangolo viene svolto correttamente solo fino al livello 13, come mostra la screenshot qui sotto:

Risposte
apatriarca
Il fattoriale cresce molto velocemente. 13! non ci sta in effetti in un intero a 32 bit e credo che questo possa essere la causa dei tuoi problemi. Se vuoi calcolare il triangolo di tartaglia per valori anche molto più grossi ti conviene usare metodi alternativi per il calcolo del coefficiente binomiale.

axpgn
Beh, puoi sempre moltiplicare per uno in meno e dividere per uno in più ...
Per esempio, per la quinta riga, parti da $1$ poi il secondo termine è $1*4/1=4$, il terzo termine è $4*3/2=6$, il quarto è $6*2/3=4$ e il quinto (che sappiamo già che è pari a uno ma possiamo usarlo come "stop") è $4*1/4=1$.
Così vai avanti un po' di più ... :-)

scriccias
"axpgn":
[/quote]
[quote="apatriarca"]


ok perfetto!
grazie mille gentilissimi :)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.