经典算法~~快速求幂的方法
来源:互联网 发布:h5穿上军装源码 编辑:程序博客网 时间:2024/04/30 07:43
快速的求幂的方法原理:
以下以求a的b次方来介绍
把b转换成二进制数。
该二进制数第i位的权为2^(i-1)
例如 a^11 = a^(2^0 + 2^1 + 2^3)
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算a^2^0 * a^2^1 * a^2^3
以上的来自百度百科:http://baike.baidu.com/link?url=o1UFGS2CuuAsA_Zl0-Lnk7pL014TarHyS91iuhR2iYyhFUCAwPGYFc2aubL05CvpBjLLsIl10FnkULDpV2PI6q#reference-[1]-4533005-wrap简单来说,就是指数的转换成二进制,基数 = 基数 * 底数,当指数二进制位为1时,则结果 = 基数 * 结果;
最后,结果就是我们想要的结果。
下面是代码:
# include <iostream># include <string>using namespace std;int main(){char *mult(char *a, char *b);char r[10000], base[10000], c[10], *str1, *str2;int i, j, k, a, b;cin >> a >> b;r[0] = '1'; r[1] = '\0'; //结果字符串为1,初始化i = 0;while(a) //将底数a转换成字符串,这个字符串的相反的{c[i] = a % 10 + '0';a = a / 10;i++;}k = 0;for(j = i - 1; j >= 0; j--, k++) //将底数a的字符串倒置base[k] = c[j]; //底数的字符串赋值到基数字符串base[k] = '\0';str1 = r, str2 = base;while(b) //快速求幂方法,时间复杂度为log2(n){if(b & 1) {str1 = mult(str1, str2); //结果为str1, 结果 * 基数}str2 = mult(str2, str2); //基数为str2, 基数 * 基数b = b >> 1; //右移}cout << str1 << endl;return 0;}char *mult(char *a, char *b) //大数的算法,很容易明白的{int length1, length2, i, j, *s;length1 = strlen(a);length2 = strlen(b);s = new int[length1 + length2]; //申请数组的空间for(i = 0; i < length1 + length2; i++)//初始化s[i] = 0;for(i = 0; i < length1; i++){for(j = 0; j < length2; j++)s[i + j + 1] += (a[i] - '0') * (b[j] - '0');}for(i = length1 + length2 - 1; i >= 0; i--) //进位{if(s[i] >= 10){s[i - 1] += s[i] / 10;s[i] %= 10;}}i = 0;while(!s[i])i++;for(j = 0; i < length1 + length2; i++, j++) //转换成字符,并覆盖到a数组{a[j] = s[i] + '0';}a[j] = '\0';delete []s; //释放return a;}
这里我用的是大数,可以算很大的次方,数组开大点,就可以算更大的。
结果:
0 0
- 经典算法~~快速求幂的方法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 快速求幂算法
- 经典算法之快速排序的C实现方法
- 快速求平方根的算法 (卡马克方法)
- 求多项式的值与求幂的快速算法
- 经典的快速排序算法
- 求最大公约数的快速算法
- 求最大公约数的快速算法
- 反向操作
- 1503140110-蓝桥杯-历届试题 回文数字
- 读取EasyUI datagrid中rowData的方式
- Redis数据库入门
- 【C语言学习笔记】流程控制
- 经典算法~~快速求幂的方法
- python 多线程多进程
- CentOS误删除文件如何恢复
- 安卓复习1-安卓基础-单元测试
- 线性表的链接存储结构-双向链表
- Vivado的helloword程序(二):软件工程部分
- AngularJS与其他框架的不同
- 嵌入式软件笔试
- bag返修台