【高精度运算】
【高精度运算】
板子很重要!
平方差
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;
}