1. 程式人生 > 其它 >程式碼模板整理(2):高精度四則運算

程式碼模板整理(2):高精度四則運算

嚴謹的程式碼模板整理

高精度四則運算

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;
}