C/C++编程小练习 大数乘方(快速幂算法实现)
来源:互联网 发布:命令与征服5知乎 编辑:程序博客网 时间:2024/05/18 15:54
将我之前的大数乘方的算法做了些小优化,代码改动很小
快速幂算法实现大数乘方,时间复杂度由O(n^3)降到O(n^2*logn)
快速幂算法原理其实蛮简单的,类似于二分法的思想,扫描指数n的二进制形式,然后按照0或1做相应处理
#include <iostream>#include <cstring>using namespace std;void reverse_str(char *a,int size){for(int i=0;i<size/2;++i){char t=a[i];a[i]=a[size-i-1];a[size-i-1]=t;}}void large_mul(char a[],char b[],char c[]){char a_t[20000]={0};char b_t[20000]={0};char c_t[40001]={0};strcpy(a_t,a);strcpy(b_t,b);int a_len=strlen(a_t);int b_len=strlen(b_t);reverse_str(a_t,a_len);reverse_str(b_t,b_len);for(int i=0;i<b_len;++i){for(int j=0;j<a_len;++j){int k=i+j;c_t[k]+=(a_t[j]-'0')*(b_t[i]-'0');if(c_t[k]>9){c_t[k+1]+=(c_t[k]/10);c_t[k]=c_t[k]%10;}}}int j;for(j=a_len+b_len;j>0;--j){if(c_t[j]!=0){break;}}c_t[j+1]=0;for(int i=j;i>=0;--i){c_t[i]=c_t[i]+'0';}reverse_str(c_t,strlen(c_t));strcpy(c,c_t);}void n_large_mul_pro(char a[],int n,char c[]){strcpy(c,"1");while(n!=0){//快速幂算法,将大数乘方的时间复杂度由O(n^3)降到O(n^2*logn)if(n&1) large_mul(a,c,c);large_mul(a,a,a);n>>=1;}}int main(){char a[20000]={0};char c[40001]={0};cin>>a;int n;cin>>n;n_large_mul_pro(a,n,c);cout<<c<<endl;return 0;}
1 0
- C/C++编程小练习 大数乘方(快速幂算法实现)
- C/C++编程小练习 大数乘方
- C/C++编程小练习 大数阶乘
- C/C++编程小练习 大数乘法之浮点大数乘法算法
- C/C++编程小练习 大数加法之浮点大数加法算法
- C/C++编程小练习 大数减法之浮点大数减法算法
- bnu1076 大数乘方 C语言版
- C/C++编程小练习 数独(DFS算法实现)
- C编程小练习
- C/C++编程小练习 八皇后问题(回溯算法实现)
- C/C++编程小练习 计算10亿之内的素数和(合数筛选算法实现)
- C语言编程小练习
- [算法练习]快速排序的C语言实现
- C/C++编程小练习 函数实现学生管理系统
- [C练习]编程实现strstr
- 大数相乘的算法实现(C#)
- 【编程练习】快速select算法的实现
- 快速排序算法(c#)实现
- Fiddler(3)--重定向(返回指定数据)
- nginx安装及简要配置
- wampserver 64位 v2.5 官方简体中文版安装教程
- Android面试必考十大试题详解
- D. 独木舟上的旅行
- C/C++编程小练习 大数乘方(快速幂算法实现)
- Win10系统BitLocker磁盘解锁后如何再次锁定?
- H. 找点
- 第十五周项目3-B-树的基本操作
- STM32共用中断和共用中断函数的判断
- Scala模式匹配、类型系统彻底精通与Spark源码阅读
- 分离码实现web服务中的信息安全传输
- Codeforces Round #367 (Div. 2) E 十字链表
- SIGINT、SIGQUIT、 SIGTERM、SIGSTOP区别