Help con questo esercizio sull'ide code::block

gio881
salve ho risolto questo esercizio in questo modo e grossomodo mi viene testandolo su code::block , l'unica cosa è l'ultimo punto , il risultato non viene !cosa sbaglio??

Scrivere un algoritmo in linguaggio C che:

- legge da tastiera tre numeri interi positivi x,y, z

- calcola il fattoriale di x e lo scrive in output

- calcola y^z e lo scrive in output


#include <stdio.h>
#include <stdlib.h>

int main (){
int i,x , y , z  , fatt, tot;
fatt=1;
tot=1;
printf ("inserisci un valore:");
scanf ("%d" , &x);
printf ("inserisci un valore:");
scanf ("%d" , &y);
printf ("inserisci un valore:");
scanf ("%d" , &z);


for (i=x ;i>=1  ; i--){

    fatt= fatt*i;

}
printf ("il fattoriale di %d e' : %d\n" ,x,fatt );


for(i=1 ; i<z ; i++) {

y= y*y;


}
printf ("il risultato di y^z e': %d " , y);




return 0;
}

Risposte
vict85
Un int a 32 bit (come suppongo sia il tuo caso) contiene valori \(\displaystyle x \) nell'intervallo \(\displaystyle -2147483648\le x \le 2147483647 \). Guardando la successione dei fattoriali, non può contenere \(\displaystyle 13! \). Per un intero a 64 bit le cose vanno meglio, ma non per molto. Arrivi appena a \(\displaystyle 9223372036854775807 \) che è minore di \(\displaystyle 21! \). Usando numeri unsigned si migliora il tutto di molto poco.
Il modo usato generalmente consiste nell'usare un double o un long double in modo da permettere la rappresentazione di numeri maggiori a scapito della precisione nei numeri più grandi.

Il problema nel secondo punto è che al passo \(\displaystyle i \) fai \(\displaystyle y_t = y_{t-1}\cdot y_{t-1} \) invece di \(\displaystyle r_{t} = r_{t-1}\cdot y \). In altre parole stai calcolando \(\displaystyle y^{2^{z-1}} \).

gio881
risolto grazie!

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