基于C/C++实现大指数幂的计算

目录

源代码

解析代码(比如计算 3^19)

其中涉及到的知识点

按位与 &

移位运算 [ 右移(>>)为例 ]


源代码

long long ksm(long long a, long long k) // a代表底数,k代表指数
{
    long long res = 1;
    while (k)
    {
        if (k & 1)
            res *= a;
        k >>= 1;
        a *= a;
    }
    return res;
}

解析代码(比如计算 3^19)

先将3^19如此转换

设最终结果:res=1底数:a指数:k(下表为二进制形式)(k==0时结束循环)

  • 中间五个表达式都为相乘关系

  • 空白:表示与上方的单元格内容一样

  • 处理1:将X^2^0计算出来并乘上 res,若是 X^(0*2^0) 的格式,则直接跳过,因为值为1,乘不乘都可以(if (k&1) res *= a; )

  • 处理2:将指数提一个2出来(k >>= 1)(此操作相对于 k /= 2)

  • 处理3:将底数和指数中提出来的2进行计算,并使之称为新的底数( a *= a )

  • 计算,将左方的五个数字相乘

步骤备注resak
0初始3^{2^{4}}3^{^{0*2^{3}}}3^{^{0*2^{2}}}3^{2^{1}}3^{2^{0}}1310011
1处理133
处理23^{2^{3}}3^{2*0*2^{2}}3^{2*0*2^{1}}3^{2*2^{0}}01001
处理39^{2^{3}}9^{0*2^{2}}9^{0*2^{1}}9^{2^{0}}9
2处理1927
处理29^{2*2^{2}}9^{2*0*2^{1}}9^{2*0*2^{0}}00100
处理381^{2^{2}}81^{0*2^{1}}81^{0*2^{0}}81
3处理11跳过
处理281^{2*2^{1}}81^{2*0*2^{0}}00010
处理36561^{2^{1}}6561^{0*2^{0}}6561
4处理11跳过
处理26561^{2*2^{0}}00001
处理343,046,721^{2^{0}}43,046,721
5处理143,046,7211,162,261,467
处理2---00000
处理3---

所以最终结果是1,162,261,467

其中涉及到的知识点

按位与 &

先转换为二进制数,再对每一位进行与运算(一一得一,其余为零)

ab二进制 a二进制 ba & b (二进制)a & b
551011011015
541011001004
531010110011
521010100000
511010010011
501010000000        

还可以利用这个判断奇偶数,将一个数转换为二进制的如下形式

2^{1}到2n(n>1)都是偶数,偶数加偶数还是偶数,2^{0}是奇数,所以看一个数的奇偶数,就看0位了

也就是 N & 1 == 1 的话,则说明是奇数

移位运算 [ 右移(>>)为例 ]

转换成二进制后,将整体往右移一定位数,即,右移2位就是去掉最右边两位,左移反之

ab二进制 aa >> b(二进制)a >> b
531010000
521010011
511010102

还有就是左/右移有个小细节:

一个无符号的int类型的数3的二进制形式:00000011(若该类型为八位的话)

左/右移的话(也就是相当于去到最右/左边的一位数):

左移后:0000011?

右移后:?0000001

其中,问号原先是不在该数据的界限之内,所以是不清楚他原先是0还是1

(我记得其中一个以为运算是补上0的,但我忘记了,而我也懒得去尝试了)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值