开始看power函数的版本二时,有点迷糊,这里用了十进制数的二进制表示法。
十进制数,这里n0,n1,n2,…,nk等于0或1,
则。
举个例子: 13=20+22+23=(1101)2,
令result初始值为1,因此要计算xn,只要将n化为二进制并由低位到高位依次判断,如果第i位为1,则。
int power(int x, unsigned n){
if (n == 0)
return 1;
else{
int result = 1;
while (n != 0){
if ((n & 1) != 0)
result *= x;
x *= x;
n >>= 1;
}
return result;
}
}
STL的power函数为了进一步提高效率,又做了优化。比如 32=(100000)2这种低位有很多0的数,可以先过滤掉低位的0再进行计算。
template <class T, class Integer, class MonoidOperation>
T power(T x, Integer n, MonoidOperation op) {
if (n == 0)
return identity_element(op);
else {
while ((n & 1) == 0) {
n >>= 1;
x = op(x, x);
}
T result = x;
n >>= 1;
while (n != 0) {
x = op(x, x);
if ((n & 1) != 0)
result = op(result, x);
n >>= 1;
}
return result;
}
}
参考:http://blog.csdn.net/morewindows/article/details/7174143