Welcome to Stratos!
total=1;while(n--!=0) total*=x;
double Potencia_Pogachense( double x, int n){ double acum = 1.0; double iter = x; int log2n = log2(n); // esta es facil for(int i=0; i<=log2n; ++i) { if( (n & (1<<i)) != 0) acum*=iter; iter*=iter; } return acum;}
Por mucho que cambies el algoritmo, no creo que ganes mucho, ya que las multiplicaciones son rapidas (desde hace tiempo), esto no es como programar un 8086, o un 68000.
El truco está en que, si el exponente es par, base^exp == (base*base)^(exp/2)
Y si el exponente es impar ?
inline double pow2(double x) { return x*x; }inline double pow3(double x) { return x*x*x; }inline double pow4(double x) { return x*x*x*x; }inline double pow5(double x) { return x*x*x*x*x; }....double (*pow[])(double& x) = { pow2, pow2, pow2, pow3, pow4, pow5, ... };se usaría de dos maneras:resultado = pow4(x); resultado = pow[n](x);
inline double pow0(double x) { return 1; }inline double pow1(double x) { return x; } inline double pow2(double x) { return x*x; } inline double pow3(double x) { return x*x*x; } ....double (*pow[])(double x) = { pow0, pow1, pow2, pow3 ..... };
class exponente{byte bases[10];exponente(){byte a = 1;byte pos;bases[0]=1;for (pos=1;pos<10;pos++)bases[pos]=bases[pos-1]*2;}int potencia(int num, int exp){int res = 1;int pos=0;while (exp>bases[pos]){if (exp & base[pos]) res *=num;num*=num;pos++;}return res;}}