高精度加、减、乘笔记

zyl 2023-10-04 9:45:12 2025-04-12 15:41:10 29
#include<iostream>
using namespace std;
// 高精度加法
string jia(string a, string b){
	int lena = a.length();
	int lenb = b.length();
	int lenc = max(lena, lenb);
	int aa[2005]={0},bb[2005]={0},cc[2005]={0};
	string c = "";
	for(int i=0;i<lena;i++) aa[i] = a[lena-i-1]-48;
	for(int i=0;i<lenb;i++) bb[i] = b[lenb-i-1]-48;
	int x = 0;
	for(int i=0;i<lenc;i++){
		cc[i] = aa[i] + bb[i] + x;
		x = cc[i]/10;
		cc[i] = cc[i]%10;
	}
	cc[lenc++] = x;
	while(cc[lenc-1]==0&&lenc-1>0) lenc--;
	for(int i=0;i<lenc;i++) c += char(cc[lenc-i-1]+48);
	return c;
}


// 高精度数大小判断
bool max_a(string a, string b){
	int lena = a.length();
	int lenb = b.length();
	if(lena!=lenb) return lena>lenb;
	else{
		for(int i=0;i<lena;i++){
			if(a[i] == b[i]) continue;
			return a[i]>b[i];
		}
	}
	return true;
}


// 高精度减法
string jian(string a, string b){
	string c;
	if(!max_a(a,b)){
		c = a;
		a = b;
		b = c;
		c = "-";
	}
	int lena = a.length();
	int lenb = b.length();
	int lenc = max(lena, lenb);
	int aa[2005]={0},bb[2005]={0},cc[2005]={0};
	for(int i=0;i<lena;i++) aa[i] = a[lena-i-1]-48;
	for(int i=0;i<lenb;i++) bb[i] = b[lenb-i-1]-48;
	int x = 0;
	for(int i=0;i<lenc;i++){
		cc[i] = aa[i] - bb[i] - x;
		if(cc[i]<0){
			cc[i] += 10;
			x = 1;
		}
		else x = 0;
	}
	cc[lenc++] = x;
	while(cc[lenc-1]==0&&lenc-1>0) lenc--;
	for(int i=0;i<lenc;i++) c += char(cc[lenc-i-1]+48);
	return c;
}


// 高精度乘法
string cheng(string a, string b){
	string s = "";
	int aa[505] = {0}, bb[505] = {0}, cc[1005] = {0};
	int lena = a.length();
	int lenb = b.length();
	int len = lena+lenb-1;
	
	for(int i=0;i<lena;i++){
		for(int j=0;j<lenb;j++){
			cc[i+j] += aa[i]*bb[j];
			cc[i+j+1] += cc[i+j]/10;
			cc[i+j] %= 10;
			if(cc[len]) len++;
		}
	}
	// 防止结果为零
	while(cc[len-1] == 0 && len-1>0) len--;
	for(int i=len-1;i>=0;i--){
		s += char(cc[i]+48);
	}
	return s;
}


int main(){
	string a,b,c;
	cin>>a>>b>>c;
	cout<<jian(jia(a,b),c);
	return 0;
}
{{ vote && vote.total.up }}