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 che atof 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 e b sono contemporaneamente nulli: in questo caso la potenza non è definita e si stampa il messaggio non calcolabile
  • si noti l'espressione b % 2 == 1 per determinare se b è dispari
  • l'operazione b = b / 2 fa già l'arrotondamento per difetto (si ricordi che la divisione intera tronca la parte decimale)

Hands-on

prova-tu 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 »

prova-tu Modifica il programma per gestire correttamente anche gli esponenti interi negativi. Sfrutta la relazione a^b = (1/a)^(−b).

Scopri esattamente come »

prova-tu In questo caso, è possibile utilizzare il ciclo do-while al posto del ciclo while utilizzato nella soluzione proposta?

Scopri di più »