杂项——高精度

  • ~1.71K 字

高精度处理非常大的数字,通过数组或者字符串实现,以下以数组的方式实现加减乘除(仅展示部分代码)。

vector<int>  add(const vector<int> &a,const vector<int> &b){
	vector<int> c;
	int carry=0;
	for(int i=0;i<max(a.size(),b.size())||carry;++i){
		int sum=carry;
		if(i<a.size()) sum+=a[i];
		if(i<b.size()) sum+=b[i];
		c.push_back(sum%10);
		carry=sum/10;
	}
	return c;
}
vector<int>  sub(const vector<int> &a,const vector<int>& b){
	vector<int> c;
	int borrow=0;
	for(int i=0;i<a.size();++i){
		int diff=a[i]-borrow;
		if(i<b.size()) diff-=b[i];
		if(diff<0){
			diff+=10;
			borrow=1;
		}
		else{
			borrow=0;
		}
		c.push_back(diff);
	}
	while(c.size()>1&&c.back()==0) c.pop_back();
	return c;
}
vector<int> multiply(const  vector<int> &a,const vector<int> &b){
	vector<int> c(a.size()+b.size());
	for(int i=0;i<a.size();++i){
		for(int j=0;j<b.size();++j){
			c[i+j]+=a[i]*b[j];
		}
	}
	int carry=0;
	for(int i=0;i<c.size();++i){
		int sum=c[i]+carry;
		c[i]=sum%10;
		carry=sum/10;
	}
	while(c.size()>1&&c.back()==0) c.pop_back();
	return  c;
}
//除法就只写大整数/小整数了,大整数/大整数还没见过,遇到了再改
vector<int> div(const vector<int> &a,int b){
    vector<int> c;
	long long rem=0;
	for(int i=a.size()-1;i>=0;--i){
		rem=rem*10+a[i];
		c.push_back(rem/b);
		rem=rem%b;
	}
	reverse(c.begin(),c.end()); 
	while(c.size()>1&&c.back()==0) c.pop_back();
	return  c;  
}
//数字转化为数组,统一一下模板,不用再单独去写一个数组和小整数了
vector<int> tov(int a){
	vector<int> c;
	while(a){
		int b=a%10;
		c.push_back(b);
		a/=10;
	}
	return c;
}