Algoritmo in C per calcolare la potenza

Obidream
Salve a tutti, vorrei realizzare il seguente programma:
Si scriva un programma in C che legga da tastiera 2 numeri interi corrispondenti a base ed esponente, ed esegua il calcolo della potenza $text{base}^text{esponente}$. Il programma deve invocare una funzione chiamata power dal programma main, con il seguente prototipo:
int power(int base, int exponent);

Suggerimento: all'interno della funzione, calcolare la potenza moltiplicando iterativamente la base per se stessa un numero di volte pari all'esponente.

Questo è il programma che ho pensato di utilizzare

#include <stdio.h>
#include <stdlib.h>

int N;
int esponente;
int power(int base, int exponent); /*"dichiararo la funzione" e scriverla in fondo al codice" per favorire la lettura */

int main()
{
printf("Inserisci la base e l'esponente\n");
scanf("%d",&N);
scanf("%d",&esponente);
if (esponente<0)
    printf("L'esponente deve essere un numero maggiore o uguale a 0\n");
else
printf("Il risultato e': %d", power(N, esponente));

return EXIT_SUCCESS;
}

int power(int base, int exponent)
{
int i, s;
for (i = 0, s = 1; i < exponent; ++i)
s *= base;
return s;
}



Vi sembra che vada bene? :)

Risposte
vict85
A occhio mi sembra vada bene.


Ti metto sotto il tuo codice con alcuni piccoli miglioramenti:
#include <stdio.h>
#include <stdlib.h>

    
int power(int base, int exponent); /*"dichiararo la funzione" e scriverla in fondo al codice" per favorire la lettura */

int main()
{
  int N;
  int esponente;
  printf("Inserisci la base e l'esponente\n");
  scanf("%d",&N);
  scanf("%d",&esponente);
  if (esponente<0)
    printf("L'esponente deve essere un numero maggiore o uguale a 0\n");
  else
    printf("Il risultato e': %d", power(N, esponente));

  return EXIT_SUCCESS;
}

int power(int base, int exponent)
{
  int i, s=1;
  for (i = 0; i < exponent; ++i)
    s *= base;
  return s;
}


P.S: La funzione power può essere calcolata in complessità logaritimica. Hai idea di come si potrebbe fare?

Obidream
Grazie Vict :)
Dunque, non ho ben capito in che modo potrei calcolare la funzione power.. in che senso complessità logaritmica?

vict85
Nel senso che puoi calcolare \(\displaystyle m^n \) con circa \(\displaystyle \log_2n \) moltiplicazioni.

Obidream
"vict85":
Nel senso che puoi calcolare \(\displaystyle m^n \) con circa \(\displaystyle \log_2n \) moltiplicazioni.

Non ho idea di come fare.. ma per il logaritmo devo includere math.h?

nessuno.nobody
"Obidream":
[quote="vict85"]Nel senso che puoi calcolare \(\displaystyle m^n \) con circa \(\displaystyle \log_2n \) moltiplicazioni.

Non ho idea di come fare.. ma per il logaritmo devo includere math.h?[/quote]
Si per il log devi includere math.h e linkare la libreria passando al compilatore -lm

Comunque, non c'entra nulla il logaritmo nel senso di funzione con quello che ti ha detto vict85, ti dice solo che esiste un procedimento algoritmico che è ottimizzato nel calcolare la potenza. E anziché fare N moltiplicazioni, te ne fa fare \(\displaystyle \log_2n \)

Conoscevo il procedimento, ma l'ho dimenticato :<

Obidream
"nessuno.nobody":
[quote="Obidream"][quote="vict85"]Nel senso che puoi calcolare \(\displaystyle m^n \) con circa \(\displaystyle \log_2n \) moltiplicazioni.

Non ho idea di come fare.. ma per il logaritmo devo includere math.h?[/quote]
Si per il log devi includere math.h e linkare la libreria passando al compilatore -lm

Comunque, non c'entra nulla il logaritmo nel senso di funzione con quello che ti ha detto vict85, ti dice solo che esiste un procedimento algoritmico che è ottimizzato nel calcolare la potenza. E anziché fare N moltiplicazioni, te ne fa fare \(\displaystyle \log_2n \)

Conoscevo il procedimento, ma l'ho dimenticato :<[/quote]
Forse ho capito, ma non so davvero come fare...

apatriarca
Un piccolo suggerimento: \( 2^n = 2^{2\,(n/2)} \)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.