#include <stdio.h><br />#include <math.h><br />//m>=0, n>=0 </p><p>int power1(int m, int n)<br />{<br /> if(n == 0)<br /> return 1;<br /> if(n == 1)<br /> return m; </p><p> if(n&1)<br /> return m*power1(m, n-1);<br /> else<br /> {<br /> int v = power1(m, n>>1);<br /> return v*v;<br /> }<br />} </p><p>int power2(int m, int n)<br />{<br /> int ret = 1;<br /> int tmp = m; </p><p> do{<br /> if(n&1)<br /> ret *= tmp;<br /> n >>= 1;<br /> tmp *= tmp;<br /> }while (n); </p><p> return ret;<br />} </p><p>int hash[10000]; </p><p>int power3(int m, int n)<br />{<br /> return pow((float)m,n);<br />} </p><p>
#include <stdlib.h><br />#include <time.h><br />void test_driver()<br />{<br /> srand(unsigned(time(NULL)));<br /> int times;<br /> while(scanf("%d", ×) != EOF)<br /> {<br /> int arg_num = 3;<br /> for(int i = 0; i < arg_num; ++i)<br /> {<br /> int beg = clock();<br /> for(int j = 0; j < times; ++j)<br /> if(i == 0)<br /> power1(23, 100000000);<br /> else if(i == 1)<br /> power2(23, 100000000);<br /> else<br /> power3(23, 100000000);<br /> printf("Time %f/n", (clock()-beg)/1000.0);<br /> }<br /> }<br />} </p><p>int main()<br />{<br /> test_driver();<br /> return 0;<br />} </p><p>
演算法一是一種標準的分治法.
演算法二是利用數的位元位特性.
即,
power(m, n) = m^n
n = ai*2^i + ... + a0+2^0(ai...a0為n的二進位表示)
那麼,
m^n = m^(ai*2^i + ... + a0*^0) = m^(ai^2) *...*(m^a0*2^2)
演算法三實際上是和演算法二是一致的, 但是由於用到了浮點數的乘法運算和模板, 效率會低很多.
前兩種, 演算法的效率PK:
10
Time 0.000000
Time 0.000000
1000
Time 0.000000
Time 0.000000
10000
Time 0.000000
Time 0.016000
100000
Time 0.032000
Time 0.203000
1000000
Time 0.219000
Time 2.141000
10000000
Time 2.250000
Time 21.422000