Help con questo esercizio sull'ide code::block
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
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
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}} \).
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}} \).
risolto grazie!