思路
我们思考下,一个无符号整数42亿 , 给它去对数 , 结果是不是32 . 那么我们可以看出来本身一个数字的二进制表示其实就是对这个数字取log2n, 这个log2n其实这是这个二进制数字的位数.
在思考下, 4 取以2为底的对数,答案是2,4的二进制位有2位,8同理三位.
那么,我们求p的m次方,是不是可以转换为求m的那些二进制为1,取这些二进制位为1的值的p次方,最终把所有二进制为1的p的i次方累乘就是结果.
举列子
2的75次方, 75 1001011 , 第一次求出 2的1次方保存到结果中并与之前结果累乘,第二次求出2的2次方,保存到结果中并与之前结果累乘,第三次求出2的三次方,但有效位不是1跳过,第四次根据2的三次方求出4次方,有效位为1,保存到结果中并与之累乘.
就是这个思路!!!
代码
/* m^p 次方 log2n*/
int Fun(int p, int m)
{
assert(m >= 0);
int next = 1;
int ret = 1;
for (; m!= 0; m >>= 1)
{
next = next*p; //每次都要算 p的i次方
if (m & 1 == 1)
{
ret = ret*next; //如果是有效位累乘该p的i次方即可
}
}
return ret;
}