高精度加减乘除

时间复杂度:

  • 加法和减法:O(m), m为最长字符串长度
  • 乘法和除法:O(m2), m为最长字符串长度

头文件:algorithm, cstring, vector

//比较字符串
bool check(string a,string b){
    if(a.size()>b.size()) return true;
    if(a.size()==b.size()&&a>=b) return true;
    return false;
}
//高精度加法
string add(string x,string y){
    string ret;
    int la,lb;
    vector<int> a,b,ans;
    if(!check(x,y)) swap(x,y);
    la=x.size();
    lb=y.size();
    bool flag=false;
    reverse(x.begin(),x.end());
    reverse(y.begin(),y.end());
    for(int i=0;i<la;i++){
        a.push_back(x[i]-'0');
        if(i<lb) b.push_back(y[i]-'0');
        else b.push_back(0);
    }
    for(int i=0;i<la;i++){
    	ans.push_back(a[i]+b[i]);
    	if(flag){
    		ans[i]++;
    		flag=false;
		}
		if(ans[i]>=10){
			ans[i]-=10;
			flag=true;
		}
	}
	if(flag) ans.push_back(1);
	reverse(ans.begin(),ans.end());
	for(auto i:ans) ret.push_back('0'+i);
	return ret;
}
//高精度减法
string sub(string x,string y){
	int n;
	vector<int> a,b,ans;
	string ret;
	if(x==y) return "0";
	if(!check(x,y)) swap(x,y);
	n=x.size();
	reverse(x.begin(),x.end());
	reverse(y.begin(),y.end());
	for(int i=0;i<n;i++){
		a.push_back(x[i]-'0');
	    if(i<y.size()) b.push_back(y[i]-'0');
	    else b.push_back(0);
	}
	bool flag=false;
	for(int i=0;i<n;i++){
	    ans.push_back(a[i]-b[i]);
	    if(flag){
	    	ans[i]--;
	    	flag=false;
	    }
	    if(ans[i]<0){
	    	ans[i]+=10;
	    	flag=true;
	    }
	}
	for(int i=ans.size()-1;i>0;i--){
		if(ans[i]!=0) break;
	    ans.pop_back();
	}
	reverse(ans.begin(),ans.end());
	for(auto i:ans) ret.push_back('0'+i);
	return ret;
}
//高精度乘法
string multi(string x,string y){
    string ret;
    int la,lb;
    if(!check(x,y)) swap(x,y);
    la=x.size();
    lb=y.size();
    vector<int> a,b,ans(la*2);
    reverse(x.begin(),x.end());
    reverse(y.begin(),y.end());
    for(int i=0;i<la;i++){
        a.push_back(x[i]-'0');
        if(i<lb) b.push_back(y[i]-'0');
        else b.push_back(0);
    }
    for(int i=0;i<la;i++){
        for(int j=0;j<la;j++){
            ans[i+j]+=a[i]*b[j];
            if(ans[i+j]>=10){
                ans[i+j+1]+=ans[i+j]/10;
                ans[i+j]%=10;
            }
        }
    }
    for(int i=ans.size()-1;i>0;i--){
		if(ans[i]!=0) break;
	    ans.pop_back();
	}
	reverse(ans.begin(),ans.end());
	for(auto i:ans) ret.push_back('0'+i);
	return ret;
}
//高精度除法
string div(string x,string y){
	string ret;
	if(!check(x,y)) return "0";
	int n=x.size();
	int m=y.size();
	string t=x.substr(0,m);
	for(int i=m-1;i<n;i++){
    	int ans=0;
    	while(check(t,y)){
    		t=sub(t,y);
    		ans++;
    	}
    	ret.push_back(ans+'0');
    	reverse(t.begin(),t.end());
    	for(int j=t.size()-1;j>=0;j--){
    		if(t[j]!='0') break;
    		t.pop_back();
    	}
    	reverse(t.begin(),t.end());
    	if(i!=n-1) t.push_back(x[i+1]);
    }
    reverse(ret.begin(),ret.end());
    for(int j=ret.size()-1;j>0;j--){
   		if(ret[j]!='0') break;
    	ret.pop_back();
    }
    reverse(ret.begin(),ret.end());
	return ret;
}

备注:vector的一些知识

posted @ 2024-12-19 22:37  Harry_W  阅读(25)  评论(0)    收藏  举报