c语言快速幂,快速幂

所谓快速幂,顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

熟悉或头文件的人都会知道函数pow()的作用,没错就是计算一个数的几次幂,其定义如下:double pow(double x,double y);

它的功能就是计算x的y次幂,返回值就是所求结果。

举个小例子:

173514926_1_20191019063404268

以上就是pow()函数的用法了,当然数字可以换成变量。

对于小范围的幂计算,我们可以直接调用pow()函数来解决,但当数据较大时,一是时间较慢,二是容易溢出。(幂运算还是很容易就溢出的,千万不要小看幂运算的威力,可还记得这张图吗?)

173514926_2_20191019063404456

2的200次幂,这个数小编已经不会读了,不知道你们怎么样,这个数太大了,以至于C语言的任何基本数据类型都装不下这个数,这里小编用到了python来计算2的200次幂。(一种支持高精度的语言)

因为幂运算的威力太大了,所以幂运算更多的考的是 a的b次幂取余m 的结果。(a^b%m)

重点来了!!!

快速幂算法用到了分治算法,幂运算的法则相信大家都知道,这里我们要用的只有一条,那就是同底数幂相乘,底数不变,指数相加!!!

我们这里用的是它的逆过程,把一个大的指数拆成若干个较小的指数(两个小的指数相加等于大的指数),然后把它们各自的结果相乘,最终的结果不变。怎么样拆才能尽可能的提高速度呢?答案只有一个,每次拆的子部分尽量相等,这样只需要进行一次计算就好了!

于是,

173514926_3_20191019063404674

根据这三种情况我们来写代码就好了,这里同样只写下一个快速幂函数,和pow()一样进行调用就好了!

173514926_4_20191019063404956

这样快速幂就写好了。

大家还记得之前提到的 a^b%m 吗?留作思考,开动脑筋想想应该怎么办吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值