首页 > 编程语言 > 详细

[算法]高精度快速幂

时间:2020-05-03 00:31:57      阅读:70      评论:0      收藏:0      [点我收藏+]

一.简介

  快速幂的效率确实很高,但是,如果如果底数和指数很大,那么单个变量很显然存不下,因此如果不掌握高精度快速幂,那么快速幂算法其实意义也不大,因为低精度的普通算法并不会有太明显的差别。

掌握了快速幂之后,高精度快速幂也就不难掌握了(快速幂:https://www.cnblogs.com/ChaseMeng/p/12790776.html)。

二.代码

 1 /**高精度快速幂*/
 2 #include<iostream>
 3 #include<cstring> 
 4 using namespace std;
 5 int result[1005]={1,0},base[1005],tmp[1005];
 6 int n;//指数
 7 int size=500;//size为结果result的1/2,因为得下面函数用到的下标[i+j] 
 8 int mul(){//高精度乘法 
 9     int i,j;
10     memset(tmp,0,sizeof(tmp));//将数组tmp初始化为0
11     for(i=0;i<size;i++){//先存放相乘得到的结果,暂时不处理进位 
12         for(j=0;j<size;j++){
13             tmp[i+j]+=result[i]*base[j];
14         }
15     }
16     for(i=0;i<size;i++){//处理进位 
17         for(j=0;j<size;j++){
18             tmp[i+j+1]+=tmp[i+j]/10;
19             tmp[i+j]%=10;
20         }
21     }
22     memcpy(result,tmp,sizeof(tmp));//将tmp数组复制到result中 
23 }
24 int myPow(){//base*base,和mul函数差不多,只改了一点点 
25     int i,j;
26     memset(tmp,0,sizeof(tmp));
27     for(i=0;i<size;i++){
28         for(j=0;j<size;j++){
29             tmp[i+j]+=base[i]*base[j];
30         }
31     }
32     for(i=0;i<size;i++){
33         for(j=0;j<size;j++){
34             tmp[i+j+1]+=tmp[i+j]/10;
35             tmp[i+j]%=10;
36         }
37     }
38     memcpy(base,tmp,sizeof(tmp));
39 }
40 
41 int main(){
42     int i,j;
43     int t;
44     cin>>t>>n;//输入底和指数 
45     for(i=0;t;i++){//将接收的底放入数组base 
46         base[i]=t%10;
47         t=t/10;
48     }
49     while(n){
50         if(n&1){
51             mul();
52         }
53         n=n>>1;
54         myPow();
55     } 
56     int flag=0;
57     for(i=2*size-1;i>=0;i--){
58         if(flag==1){
59             cout<<result[i]; 
60         }
61         if(flag==0&&result[i]!=0){
62             flag=1;
63             cout<<result[i];
64         }
65     } 
66     return 0;
67 }

三.总结(注意事项)

  没啥好总结,size 越大,计算越慢,当需要的size很大的时候,最好标记一下数组的长度,否则上面的for都是从0~size 扫一遍,很浪费时间。

[算法]高精度快速幂

原文:https://www.cnblogs.com/ChaseMeng/p/12820083.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!