Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-12-2011, 16:18   #1
Ben Echmeyer
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);
}
Sapete indicarmi l'errore? grazie in anticipo
Ben Echmeyer è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2011, 16:40   #2
Mettiu_
Member
 
L'Avatar di Mettiu_
 
Iscritto dal: Jul 2011
Messaggi: 250
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, furletto, SL45i
Mettiu_ è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2011, 16:46   #3
Ben Echmeyer
Junior Member
 
Iscritto dal: Nov 2011
Messaggi: 5
non ci avevo pensato! grazie!
Ben Echmeyer è offline   Rispondi citando il messaggio o parte di esso
Old 24-12-2011, 22:50   #4
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Fatti restituire un unsigned long e stai apposto per un bel pezzo
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 25-12-2011, 11:35   #5
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da clockover Guarda i messaggi
Fatti restituire un unsigned long e stai apposto per un bel pezzo
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 25-12-2011, 14:21   #6
WarDuck
Senior Member
 
L'Avatar di WarDuck
 
Iscritto dal: May 2001
Messaggi: 13043
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.
WarDuck è offline   Rispondi citando il messaggio o parte di esso
Old 25-12-2011, 20:37   #7
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
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.
hai ragione... long long è a 64 bit

comunque meglio sempre usare un metodo iterativo che uno ricorsivo, anche se il fattoriale ricorsivo si fa con una riga
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 13:08   #8
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da clockover Guarda i messaggi
hai ragione... long long è a 64 bit

comunque meglio sempre usare un metodo iterativo che uno ricorsivo, anche se il fattoriale ricorsivo si fa con una riga
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 13:13   #9
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da marco.r Guarda i messaggi
e perche' mai ?
perchè la ricorsione spreca più memoria, serve un record di attivazione per ogni chiamata , il che vuol dire che il metodo iterativo produce meno garbage anche se è molto più lungo!
__________________
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 13:15   #10
clockover
Senior Member
 
L'Avatar di clockover
 
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.
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 13:16   #11
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da tecno789 Guarda i messaggi
perchè la ricorsione spreca più memoria, serve un record di attivazione per ogni chiamata , il che vuol dire che il metodo iterativo produce meno garbage anche se è molto più lungo!
appunto
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 13:37   #12
Rsk
Senior Member
 
L'Avatar di Rsk
 
Iscritto dal: Dec 2006
Messaggi: 314
Quote:
Originariamente inviato da tecno789 Guarda i messaggi
perchè la ricorsione spreca più memoria, serve un record di attivazione per ogni chiamata , il che vuol dire che il metodo iterativo produce meno garbage anche se è molto più lungo!
Altrimenti si può fare così

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 08:44.
Rsk è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 13:47   #13
GByTe87
Senior Member
 
L'Avatar di GByTe87
 
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
Quote:
Originariamente inviato da tecno789 Guarda i messaggi
...il metodo iterativo produce meno garbage anche se è molto più lungo!
int n = 6, f;
for (f = n, n--; n > 0; f *= n--);

Due righe.
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO
GByTe87 è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 14:04   #14
L4ky
Senior Member
 
L'Avatar di L4ky
 
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)
L4ky è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 14:16   #15
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da GByTe87 Guarda i messaggi
int n = 6, f;
for (f = n, n--; n > 0; f *= n--);

Due righe.
bravo.. io sono riuscito a farlo solo in 3
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 26-12-2011, 16:38   #16
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da tecno789 Guarda i messaggi
perchè la ricorsione spreca più memoria, serve un record di attivazione per ogni chiamata , il che vuol dire che il metodo iterativo produce meno garbage anche se è molto più lungo!
Non e' detto. L'unico difetto puo' essere l'esaurimento dello stack, evitabile se il linguaggio e/o il compilatore supporta le ottimizzazioni per la tail recursion (se ricordo bene gcc dovrebbe farlo).
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2011, 11:09   #17
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Non e' detto. L'unico difetto puo' essere l'esaurimento dello stack, evitabile se il linguaggio e/o il compilatore supporta le ottimizzazioni per la tail recursion (se ricordo bene gcc dovrebbe farlo).
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.
il problema non si pone per quanto riguarda le performance visto che il programma è abbastanza corto, ma si pone per la memoria. Ora prendi lo stesso programma fatto in modo iterativo e in modo ricorsivo, compilali e avviali e guarda quanta memoria utilizzano, noterai con molto piacere che quello con la ricorsione utilizza un pò più di memoria, se hai una ram da 512 kb devi stare molto attento
__________________
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 27-12-2011, 22:32   #18
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da tecno789 Guarda i messaggi
il problema non si pone per quanto riguarda le performance visto che il programma è abbastanza corto, ma si pone per la memoria. Ora prendi lo stesso programma fatto in modo iterativo e in modo ricorsivo, compilali e avviali e guarda quanta memoria utilizzano, noterai con molto piacere che quello con la ricorsione utilizza un pò più di memoria, se hai una ram da 512 kb devi stare molto attento
Una chiamata ricorsiva con tail call ottimizzata consuma spazio costante sullo stack. Ovviamente occorre che ci sia effettivamente la tail call, e nel caso del fattoriale non e' molto pratico. Ma visto che se ne faceva un discorso generale...
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2011, 00:44   #19
tecno789
Senior Member
 
L'Avatar di tecno789
 
Iscritto dal: Jan 2010
Città: (MB)
Messaggi: 11971
Quote:
Originariamente inviato da marco.r Guarda i messaggi
Una chiamata ricorsiva con tail call ottimizzata consuma spazio costante sullo stack. Ovviamente occorre che ci sia effettivamente la tail call, e nel caso del fattoriale non e' molto pratico. Ma visto che se ne faceva un discorso generale...
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
tecno789 è offline   Rispondi citando il messaggio o parte di esso
Old 28-12-2011, 10:53   #20
demos88
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 5900X @ 4,7Ghz + Thermalright Phantom Spirit 120 SE / MB Asus X470-F Gaming / RAM 2x16GB DDR4 Corsair 3600 CL16 / VGA Sapphire RX 7900 XT Nitro+ / SSD Crucial T500 1TB + Samsung 970 Pro 512GB + Sandisk 960GB Ultra II / PSU FSP Hydro G PRO 1000W / Headset Kingston HyperX Flight
demos88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Space Pioneer starebbe realizzando un pr...
SpaceX ritirerà ''a breve'' il Fa...
La Luna ha un nuovo cratere di grandi di...
ROG Cronox: ASUS alza l'asticella dei ca...
Lenovo annuncia nuovi sistemi per la vir...
M6 e M5 Ultra, i primi benchmark conferm...
La nuova falla della cybersecurity &egra...
The Blood of Dawnwalker, il sequel potre...
Colpiti i data center Amazon: irrecupera...
Google Wallet, nuova interfaccia in arri...
iPhone Duo, problemi di produzione per i...
Firefox diventa più veloce con PDF e JPE...
WhatsApp, arriva su iOS la nuova scorcia...
Snap presenta Specs: realtà aumentata, c...
SteamOS verso un cambiamento epocale: ar...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:02.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v