Potenza col metodo del contadino russo - Soluzione
Un esempio di soluzione per l'esercizio del calcolo della potenza con il metodo del contadino russo è la seguente:
#include <stdio.h>
#include <stdlib.h>
int main() {
char s[80];
double a;
int b;
double risultato;
/* Lettura dei dati */
printf("Inserisci la base: ");
fgets(s, sizeof(s), stdin);
a = atof(s);
printf("Inserisci l'esponente: ");
fgets(s, sizeof(s), stdin);
b = atoi(s);
if ((b < 0) || (a == 0 && b == 0)) {
/* Il calcolo non puo` essere eseguito */
printf("[POTENZA]\n");
printf("non calcolabile\n");
} else {
/* Parte principale dell'algoritmo */
risultato = 1;
while (b > 0) {
/* Quando l'esponente e` dispari si esegue la moltiplicazione
che produce il risultato */
if (b % 2 == 1)
risultato *= a;
a = a * a; /* quadrato della base */
b = b / 2; /* dimezzamento dell'esponente con arrotondamento */
}
/* Stampa del risultato nel formato previsto da pvcheck */
printf("[POTENZA]\n");
printf("%f\n", risultato);
}
return 0;
}
Commenti
- viene usata
fgets
per la lettura di una stringa da tastiera, per cui serve anche la dichiarazione della stringa (s
in questo caso) per memorizzare i caratteri inseriti da tastiera - vengono usate sia
atoi
cheatof
per convertire numeri che devono essere rispettivamente interi e in virgola mobile - la condizione
b < 0
prima del ciclo serve per evitare di eseguirlo in caso l'esponente sia negativo (con relativa stampa di output) - sempre prima del ciclo, si verifica, nella stessa condizione, se
a
eb
sono contemporaneamente nulli: in questo caso la potenza non è definita e si stampa il messaggionon calcolabile
- si noti l'espressione
b % 2 == 1
per determinare seb
è dispari - l'operazione
b = b / 2
fa già l'arrotondamento per difetto (si ricordi che la divisione intera tronca la parte decimale)
Hands-on
Riscrivi il costrutto iterativo while (b > 0) {
omettendo le parentesi tonde come segue:
while b > 0 {
Ricompila il programma e verifica cosa succede. Perché?
Scoprilo cliccando qui »
Modifica il programma per gestire correttamente anche gli esponenti interi negativi.
Sfrutta la relazione a^b = (1/a)^(−b)
.
In questo caso, è possibile utilizzare il ciclo do-while
al posto del ciclo while
utilizzato nella soluzione proposta?