蓝桥杯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;  
}
posted @ 2025-03-15 20:08  chicali  阅读(40)  评论(0)    收藏  举报