【高精度运算】

【高精度运算】

板子很重要!

平方差

https://www.lanqiao.cn/problems/3213/learning/
要注意很多细节问题:特别是比大小!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string> 
#include<vector>
using namespace std;
//高精度
string A,B;
string a,b;
vector<int> aa,bb; 
//高精度乘 
vector<int> qmi(vector<int> &x,vector<int> &y){
	int lx=x.size(),ly=y.size();
	vector<int> ans(lx+ly+1,0);
	for(int i=0;i<ly;i++){
		for(int j=0;j<lx;j++){
			int tmp=y[i]*x[j];
			int wei=i+j;
			ans[wei]+=tmp;
		}
	}
	//处理进位
	int t=0;
	for(int i=0;i<lx+ly+1;i++){
		ans[i]+=t;
		t=ans[i]/10;
		ans[i]%=10;
	}
	//去掉前导0
	int la=ans.size();
	int cnt=la;
	for(int i=la-1;i>=0;i--){
		if(ans[i]==0) cnt=i;
		else break;
	}
	for(int i=1;i<=la-cnt;i++) ans.pop_back();
	if(ans.empty()) ans.push_back(0);
	return ans;
}
//高精度减法
vector<int> miu(vector<int> &x,vector<int> &y){
	vector<int> ans;
	int lx=x.size(),ly=y.size();
	int t=0;
	for(int i=0;i<ly;i++){
		int nx=x[i],ny=y[i];
		if(nx+t<ny){
			int na=nx+10-ny+t;
			t=-1;
			ans.push_back(na);
		}
		else{
			int na=nx-ny+t;
			t=0;
			ans.push_back(na);
		}
	}
	for(int i=ly;i<lx;i++){
		int nx=x[i],ny=0;
		if(nx+t<ny){
			int na=nx+10-ny+t;
			t=-1;
			ans.push_back(na);
		}
		else{
			int na=nx-ny+t;
			t=0;
			ans.push_back(na);
		}
	}
	//去掉前导0
	int la=ans.size();
	int cnt=la;
	for(int i=la-1;i>=0;i--){
		if(ans[i]==0) cnt=i;
		else break;
	}
	for(int i=1;i<=la-cnt;i++) ans.pop_back();
	if(ans.empty()) ans.push_back(0);
	return ans;
}
int main(){
	cin>>A>>B;
	//忽略负号 
	if(A[0]=='-'){
		for(int i=1;i<A.size();i++){
			a+=A[i];
		}
	}
	else a=A;
	if(B[0]=='-'){
		for(int i=1;i<B.size();i++){
			b+=B[i];
		}
	}
	else b=B;
	for(int i=a.size()-1;i>=0;i--){
		aa.push_back(a[i]-'0');
	}
	for(int i=b.size()-1;i>=0;i--){
		bb.push_back(b[i]-'0');
	}
	//高精度乘法 
	vector<int> a2=qmi(aa,aa);
	vector<int> b2=qmi(bb,bb);
	bool is_mu=0;
	vector<int> ans3;
	//判断大小 
	//高精度减法
	int la2=a2.size(),lb2=b2.size();
	if(la2<lb2){
		is_mu=1;
		ans3=miu(b2,a2);
	}
	else if(la2==lb2){
		int da=0;//0表示a大 1表示b大 
		//判断大小老毛病!!! 
		for(int i=la2-1;i>=0;i--){
			if(b2[i]>a2[i]){
				da=1;
				break;
			}
			else if(a2[i]>b2[i]){
				break;
			}
		}
		if(da==0){
			ans3=miu(a2,b2);
		}
		else if(da==1){
			is_mu=1;
			ans3=miu(b2,a2);
		}
	}
	else if(la2>lb2){
		ans3=miu(a2,b2);
	}
	//输出答案 
	if(is_mu) cout<<"-";
	for(int i=ans3.size()-1;i>=0;i--) cout<<ans3[i];
	return 0;
}
posted @ 2025-04-08 11:25  White_ink  阅读(7)  评论(0)    收藏  举报