首页 > 代码库 > 高精度模板
高精度模板
用类实现的高精度模板实在是太臃肿了,用过程实现一次方便记忆
1 #include<iostream> 2 #include<cstring> 3 #include<iomanip> 4 using namespace std; 5 6 const int MAXN=500; 7 const int DLEN=4; 8 const int WIDE=10000; 9 int A[MAXN],B[MAXN],C[MAXN]; 10 int La,Lb,Lc; 11 12 void Input(string s,int *T,int &Len) 13 { 14 int k=1,num=0; 15 memset(T,0,sizeof(&T));Len=0; 16 for(int i=s.size()-1;i>=0;i--) 17 { 18 if(k==WIDE) T[Len++]=num,num=0,k=1; 19 num+=k*(s[i]-‘0‘); 20 k*=10; 21 } 22 if(num>0) T[Len++]=num; 23 } 24 25 void Output(const int *T,int Len) 26 { 27 cout<<T[Len-1]; 28 for(int i=Len-2;i>=0;i--) 29 { 30 cout.width(DLEN); 31 cout.fill(‘0‘); 32 cout<<T[i]; 33 } 34 } 35 36 bool cmp(const int *A,const int *B,int LA,int LB) 37 { 38 if(LA!=LB) return LA<LB; 39 for(int i=LA-1;i>=0;i--) 40 if(A[i]!=B[i]) 41 return A[i]<B[i]; 42 return 0; 43 } 44 45 void Add(const int *A,const int *B,int *C,int LA,int LB,int &LC) 46 { 47 int L=max(LA,LB); 48 memset(C,0,sizeof(int)*MAXN);LC=L; 49 for(int i=0;i<L;i++) 50 { 51 C[i]+=A[i]+B[i]; 52 if(C[i]>=WIDE) 53 C[i]-=WIDE,C[i+1]++; 54 } 55 if(C[L]>0) LC++; 56 } 57 58 int Dec(const int *A,const int *B,int *C,int LA,int LB,int &LC) 59 { 60 bool flag=1; 61 int L=max(LA,LB); 62 memset(C,0,sizeof(int)*MAXN);LC=L; 63 if(cmp(A,B,LA,LB)) swap(A,B),swap(LA,LB),flag=0; 64 for(int i=0;i<L;i++) 65 { 66 C[i]+=A[i]-B[i]; 67 if(C[i]<0) 68 C[i]+=WIDE,C[i+1]--; 69 } 70 while(C[LC-1]==0) LC--; 71 return flag; 72 } 73 74 void Mult(const int *A,const int *B,int *C,int LA,int LB,int &LC) 75 { 76 memset(C,0,sizeof(int)*MAXN); 77 for(int i=0;i<LA;i++) 78 for(int j=0;j<LB;j++) 79 { 80 LC=i+j; 81 C[LC]+=A[i]*B[j]; 82 if(C[LC]>=WIDE) 83 C[LC+1]+=C[LC]/WIDE,C[LC]%=WIDE; 84 } 85 LC=LA+LB; 86 if(C[LC-1]==0) LC--; 87 } 88 89 void Div2(int *A,int &LA) 90 { 91 for(int i=LA-1;i>=0;i--) 92 { 93 if(A[i]%2&&i>0) 94 A[i-1]+=WIDE; 95 A[i]/=2; 96 } 97 while(A[LA-1]==0) LA--; 98 } 99 void Inc(int *A,int &LA)100 {101 A[0]++;102 for(int i=0;i<LA;i++)103 if(A[i]>=WIDE)104 A[i]-=WIDE,A[i+1]++;105 if(A[LA]>0) LA++;106 }107 108 void Div(const int *A,const int *B,int *C,int LA,int LB,int &LC)109 {110 int Left[MAXN],Right[MAXN],Temp[MAXN];111 int L=1,R=LA,t,p=1;112 memset(Left,0,sizeof(int)*MAXN);113 memcpy(Right,A,sizeof(int)*MAXN);114 while(cmp(Temp,Right,t,R))115 {116 Add(Left,Right,Temp,L,R,t);117 Div2(Temp,t);118 Mult(Temp,B,C,t,LB,LC);119 if(cmp(A,C,LA,LC))120 memcpy(Right,Temp,sizeof(int)*MAXN),R=t;121 else 122 memcpy(Left,Temp,sizeof(int)*MAXN),L=t;123 memcpy(Temp,Left,sizeof(int)*MAXN),t=L;124 Inc(Temp,t);125 }126 memcpy(C,Left,sizeof(int)*MAXN);LC=L;127 }128 129 int main()130 {131 string s1,s2;132 cin>>s1>>s2;133 Input(s1,A,La);134 Input(s2,B,Lb);135 Div(A,B,C,La,Lb,Lc);136 Output(C,Lc);137 return 0;138 }
高精度模板
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。