蓝桥杯14届C++A组 平方差:高精度乘高精度(朴素版)、高精度减法
参考dalao题解:https://www.acwing.com/solution/content/13694/
orz

代码如下:
时间复杂度O(n**2)
#include <bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> &A,vector<int> &B){
vector<int> C(A.size()+B.size()+1);
for (int i=0;i<A.size();i++) {
for (int j=0;j<B.size();j++) {
C[i + j] += A[i] * B[j];
C[i + j + 1] += C[i + j] / 10;
C[i + j] %= 10; //将乘法转换为加法,具体见图示
}
}
while (C.size() > 1 && C.back()==0) C.pop_back();
return C;
}
bool cmp(vector<int> &A,vector<int> &B){
if(A.size()!=B.size()) return A.size()>B.size();
for(int i=A.size()-1;i>=0;i--){
if(A[i]!=B[i]) return A[i]>B[i];
}
return false;
}
vector<int> sub(vector<int> &A,vector<int> &B){
if(cmp(B,A)) return sub(B,A);
vector<int> C;
int t = 0;
for(int i=0;i<A.size()||t;i++){
t = A[i]-t;
if(i<B.size()) t-=B[i];
C.push_back((t+10)%10);
if(t<0) t = 1;
else t = 0;
}
while(C.size()>1&&C.back()==0) C.pop_back();
return C;
}
int main() {
string a,b;
cin>>a>>b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;i--) if(a[i]!='-') A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;i--) if(b[i]!='-') B.push_back(b[i]-'0');
auto C1 = mul(A,A);
auto C2 = mul(B,B);
auto C3 = sub(C1,C2);
if(cmp(C2,C1)) cout<<'-';
for(int i=C3.size()-1;i>=0;i--) cout<<C3[i];
puts("");
return 0;
}
浙公网安备 33010602011771号