程式碼模板整理(2):高精度四則運算
阿新 • • 發佈:2022-06-06
嚴謹的程式碼模板整理
高精度四則運算
1.高精度
1-1 高精度加法
首先,需要3個數組,$a[ i]$ $b[i]$ 分別儲存輸入的$a,b$($a,b$以字串讀入)
然後,從末尾開始相加,逢十進一,並儲存到$c[i]$之中
最後,倒序輸出即可
程式碼如下:
#include<bits/stdc++.h> using namespace std; int a[10000], b[10000], c[10000];//分別儲存 string A, B; int main(){ cin>>A>>B; int q=1, w=1; int len=max(A.size(), B.size()); for(int i=A.size()-1;i>=0;i--){ a[q]=A[i]-'0'; q++; } for(int i=B.size()-1;i>=0;i--){ b[w]=B[i]-'0'; w++; }//分別處理 for(int i=1;i<=max(q,w);i++){ c[i]+=a[i]+b[i]; c[i+1]=c[i]/10; c[i]%=10; }//計算 if(c[len+1]){ len++; } for(int i=len;i>=1;i--){ cout<<c[i]; }//輸出 return 0; }
1-2 高精度減法
具體思想和高精度加法相似
按照減法規則模擬即可
#include<bits/stdc++.h> using namespace std; int A[100000], B[100000], C[100000]; string a, b; int main(){ cin>>a>>b; int q=1, w=1; if(a.size()<b.size()){ swap(a, b); C[0]=-1; }else if(a.size()==b.size()){ if(a<b){ swap(a, b); C[0]=-1; } } int len=a.size(); for(int i=a.size()-1;i>=0;i--){ A[q]=a[i]-'0'; q++; } for(int i=b.size()-1;i>=0;i--){ B[w]=b[i]-'0'; w++; } for(int i=1;i<=len;i++){ C[i]+=A[i]-B[i]; if(C[i]<0){ C[i+1]-=1; C[i]+=10; } } if(C[0]==-1){ cout<<"-"; } int count=0; for(int i=len;i>=1;i--){ if(C[i]==0){ count++; } if(count==len){ cout<<0; return 0; } } for(int i=len;i>=1;i--){ cout<<C[i]; } return 0; }
1-3 高精度乘法
這個比較特殊,需要計算貢獻
其計算方法是
$$
c[i+j]=c[i+j]+A[i] * B[j]
$$
然後就是基操
#include<bits/stdc++.h> using namespace std; long long c[30000]={0}; long long A[10000], B[10000]; int main() { string a, b; cin>>a>>b; int q=0, w=0; for(int i=a.size()-1; i>=0; i--) { A[w]=a[i]-'0'; w++; } for(int i=b.size()-1; i>=0; i--) { B[q]=b[i]-'0'; q++; } for(int i=0; i<=w; i++) { for(int j=0; j<=q; j++) { c[i+j]+=A[i]*B[j];//計算貢獻 c[i+j+1]+=c[i+j]/10; c[i+j]%=10; } } int m=a.size()+b.size(); for(; !c[m]&&m>=1;) { m--; } for(int i=m; i>=0; i--) { cout<<c[i]; } return 0; }
1-4 高精度除法*
這個不解釋(因為不會),先放個程式碼
高精度$/$單精度
string mul(string x,string y) {
int a[maxn],b[maxn],c[maxn];
string ans;
int lena=x.length(),lenb=y.length(),len=lena+lenb-1;
for(int i=0; i<lena; i++) a[lena-i-1]=x[i]-'0';
for(int i=0; i<lenb; i++) b[lenb-i-1]=y[i]-'0';
for(int i=0; i<lena; i++)
for(int j=0; j<lenb; j++)
c[i+j]+=a[i]*b[j];
int temp=0;
for(int i=0; i<len; i++) {
c[i]+=temp;
temp=c[i]/10;
c[i]%=10;
}
while(temp) c[len++]=temp%10,temp/=10;
while(!c[len-1] && len>1) len--;
for(int i=len-1; i>=0; i--) ans+=c[i]+'0';
return ans;
}