快速幂

对于一个a^{98765} , 我们可以把它分为 a ^{ 9*10^4 + 8*10 ^ 3+7*10^ 2+6*10^1+5 * 10 ^ 0 }
如果化为二进制,则底数为a,指数为0或者1乘以2的次方的权重。
我们不妨举例一个例子
a ^ {4}
等价转换为a^{1*2^2+0*2^1+0^*2^0} = (a^{2^2})^1*(a^{2^1})^0*1 = a^4

二进制数每位权重等于前一位自乘一次。任意进制数也一样。
故而我们可以看到,可以将指数按部分解,并且可以看到可以是10进制,也可以说是任意n进制。为了简化,我们将其化为二进制。故而每次计算出最后一项,只要先取n&1 看末尾数是不是1,如果是1,则乘上底数,如果不是,则部乘上底数。每次做完之后n=n>>1。

代码如下。

#include<cstdio>
int power(int a,int n){
    int p = a;
    int pow = 1;
    while( n > 0 ){
        if( n & 1)
            pow *=p;//如果末尾是1,就累乘以上去
        p*=p;//每一位的底数,指数为2次方权重
        n = n>>1;
    }
    return pow;
}
int main()
{
    int a,n;
    a = 2;
    n = 10;
    printf("%d\n",power(a,n));
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 最近准备蓝桥杯和PAT甲级,刷了不少题,有看题解写的,有自己绞尽脑汁肝的,总算是有点收获吧,今天刷完了洛谷的...
    MambaHJ阅读 1,246评论 0 1
  • 题目链接POJ307 题意:求第n位斐波那契数mod 10000的大小。其中n的大小高达1000000000 由于...
    徐森威阅读 12,797评论 4 8
  •   说实话,自己是第一次接触到快速幂这种东西,觉得有必要记录下来。 题意: 样例: 挑战: 1.解题思路   在介...
    琼珶和予阅读 5,474评论 0 3
  • 昨天晚上接到闺蜜秀秀的电话,给我打我没接起来,然后,我回过去打了三个,电话通了后,那边是一阵狂哭,瞬间错乱...
    然然然然后呢阅读 155评论 0 0
  • 最近搞了几个iOS的动画效果,但是一直还没有整体的总结一下.今天来大概的理一下思路:我们动画用到的框架有哪些 1...
    健健锅阅读 3,264评论 0 14