快速求幂算法
来源:互联网 发布:淘宝保健品准入门槛 编辑:程序博客网 时间:2024/04/30 04:04
快速求正整数次幂,当然不能直接死乘。举个例子:
3 ^ 999 = 3 * 3 * 3 * … * 3
直接乘要做998次乘法。但事实上可以这样做,先求出2^k次幂:
3 ^ 2 = 3 * 3
3 ^ 4 = (3 ^ 2) * (3 ^ 2)
3 ^ 8 = (3 ^ 4) * (3 ^ 4)
3 ^ 16 = (3 ^ 8) * (3 ^ 8)
3 ^ 32 = (3 ^ 16) * (3 ^ 16)
3 ^ 64 = (3 ^ 32) * (3 ^ 32)
3 ^ 128 = (3 ^ 64) * (3 ^ 64)
3 ^ 256 = (3 ^ 128) * (3 ^ 128)
3 ^ 512 = (3 ^ 256) * (3 ^ 256)
再相乘:
3 ^ 999
= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3
这样只要做16次乘法。即使加上一些辅助的存储和运算,也比直接乘高效得多(尤其如果这里底数是成百上千位的大数字的话)。
我们发现,把999转为2进制数:1111100111,其各位就是要乘的数。这提示我们利用求二进制位的算法:
#include <stdio.h>#include <math.h>//循环算法int loop(int a,int b){ int tem=1,ret=a; while(b>0) { if(b&1)//当b的最低位为1时 { tem = tem * ret; } ret = ret*ret;//求a的n次方 b>>=1; } return tem;}int main(){ int a,b; while(1) { printf("For a^b input a and b:"); scanf("%d%d",&a,&b); printf("The loop method:\n"); printf("%d\n",loop(a,b)); } return 0;}
阅读全文
0 0
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 常用算法-快速求幂
- 【算法】矩阵快速求幂
- 快速求幂二分算法
- 算法 二分求幂(快速取幂)
- 非递归快速求幂算法
- 经典算法~~快速求幂的方法
- LeetCode Super Pow(快速求幂算法)
- Flex 布局
- 第二章 渲染流水线(上)---GPU流水线
- UVa 11354
- Project Euler__problem 6
- python与java的对比学习(一)
- 快速求幂算法
- 如何像聪明人一样思考?
- tomcat 安全认证 Realm 及 多种类型 Realm 配置
- 《机器学习》第二章 模型评估与选择 笔记2 泛化误差的评估方法
- java web项目获取src和WebContent目录下的配置文件
- Java并发编程:volatile关键字解析
- SSO之CAS单点登录详细搭建教程
- BZOJ 2346 [Baltic 2011]Lamp dijkstra堆优化
- java socket tcp/ip基本数据类型编解码【高序字节 低序字节】