|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Nov 2011
Messaggi: 5
|
[C] calcolo fattoriale
Salve, ho un problema nello scrivere un programma in cosole che calcoli il fattoriale, quando lo avvio lo calcola esatto fino a 12 ma con numeri più alti da risultati sbagliati oppure "0", questo è codice che ho usato:
Codice:
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
long int fattoriale(int n);
using namespace std;
long int a, n;
int scelta;
int main(void)
{
do{
printf("Inserire un numero per calcolarne il fattoriale \n");
scanf("%i", &a);
printf("Risultato: %i\n", fattoriale(a));
printf("premere 0 per uscire o un numero qualsiasi per ripere il programma\n");
scanf("%i", &scelta);
}
while(scelta!=0);
}
long int fattoriale(int n)
{
if(n==0) return(1);
else return n* fattoriale(n-1);
}
|
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jul 2011
Messaggi: 246
|
Ciao, il tipo long int in C mi pare sia su 32 bit ma il risultato di 13 fattoriale non entra in 32 bit... Puoi provare ad utilizzare double (8 byte di solito) anzichè long int così allarghi l'intervallo di valori "calcolabili"
__________________
Non c'è cosa peggiore nella vita di un programmatore di un errore che si presenta solo ogni tanto. CONCLUSO POSITIVAMENTE CON: oldfield |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Nov 2011
Messaggi: 5
|
non ci avevo pensato! grazie!
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Fatti restituire un unsigned long e stai apposto per un bel pezzo
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
quoto, è sicuramente quello il problema!
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 12966
|
In C long è a 32 bit, long long è presente dallo standard C99 e ti consente di memorizzare interi a 64bit.
Alternativamente puoi usare un double. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Quote:
comunque meglio sempre usare un metodo iterativo che uno ricorsivo, anche se il fattoriale ricorsivo si fa con una riga |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
e perche' mai ?
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
perchè la ricorsione spreca più memoria, serve un record di attivazione per ogni chiamata
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Il metodo iterativo è più veloce... sempre. Nel caso del fattoriale non c'è nessun problema, ma diciamo che in generale è preferibile sempre un metodo iterativo. Inoltre per metodi (o funzioni) che richiedono uno stack elevato si rischia anche di occupare troppa memoria e far crashare il programma.
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
Quote:
Tail recursive Codice:
long fact(long res, long n){
if n==1 return res
return fact(res*n,n-1)
}
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB Ultima modifica di Rsk : 27-12-2011 alle 09:44. |
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
for (f = n, n--; n > 0; f *= n--); Due righe.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: May 2008
Messaggi: 1566
|
Puoi recuperare ancora un bit facendo:
Codice:
unsigned long long int x;
__________________
CM Obsidian 750D - Corsair TX650M - AMD Ryzen 7 3700x - Asus TUF B550-PLUS - nVidia Gigabyte GTX 1060 6GB G1 Gaming - Noctua D15S - Corsair Vengeance Pro 3600MHz 16GB - 2xHP x27i - Razer Deathadder - Logitech G15 v1 nVidia Edition- Roccat Taito King-Size - Fastweb (2011) | Alice(2015) | Alice(2016) | Eolo 30Mb (2016) | Wind3 4G Flat (2019) | PF AIR 100 (2021) |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
peccato che la ricorsione sia solo 1 comunque era ironico
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Per quel che riguarda le performance, anche in un esempio semplice come il fattoriale oltre ad un certo punto la cpu passa ben poco tempo nella creazione e cancellazione dello stack di attivazione, quanto a gestire numeri di lunghezza arbitraria. Non mi viene in mente un esempio piu' semplice al momento, ma se a qualcuno viene in mente possiamo vedere.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
Quote:
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
|
capisco...no ma infatti non ho detto niente, ho esposto quanto da me studiato e cerco sempre di imparare cose nuove, quello che tu mi hai detto non lo sapevo.
__________________
CPU: Ryzen 3700x DISSY: CM HYPER EVO 212 RAM: 16gb DDR4 3000Mhz MOBO: MSI b350 tomahawk VGA: MSI Ventus 2X 4060TI 16GB ALI: Cooler Master V550 SSD: Samsung 970 Evo Plus Trattive+:(a) topolino2808(x2), galfum, giap959, sm_morgan, Biduzzo, huangwei, maxmax80, bubbi, dinamite2, PaxNoctis;(v) rubrie, CubeDs, Slater91, Juvanni, FireFox152, gluvocio, giulio81, emahwupgrade, Velvet, semmy83, giocher03 |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Padova
Messaggi: 2342
|
Per il calcolo del fattoriale bisognerebbe usare una variabile intera perchè per definizione il fattoriale è una funzione da naturale a naturale quindi un unsigned long sarebbe la scelta più coerente "matematicamente".
Tuttavia anche con un unsigned long, raggiungi l'overflow molto presto. Il long double è assolutamente più capiente in quanto la virgola mobile usa una notazione approssimata esprimendo il valore come mantissa e esponente. Però proprio questa approssimazione, che tipicamente non è esatta nemmeno per valori interi, ti darà un risultato del fattoriale approssimato. L'alternativa è usare librerie ad-hoc come http://gmplib.org/
__________________
CPU Ryzen 2600 @ 3,95Ghz + Bequiet Dark Rock TF / MB Asus X470-F Gaming / RAM 2x8GB DDR4 G.Skill FlareX 3200 CL14 / VGA Sapphire RX 7900 XT Nitro+ @ 3200Mhz / SSD Samsung 970 Pro 512GB + Sandisk 240GB Plus + Sandisk 960GB Ultra II PSU Seasonic Platinum P-660 / Headset Kingston HyperX Flight |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:30.




















