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ù »