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!