高精度加法

// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);

    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }

    if (t) C.push_back(t);
    return C;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing

题目练习

题目链接
给定两个正整数,计算它们的和。1≤整数长度≤100000

输入

共两行,每行包含一个整数。

12
23

输出

共一行,包含所求的和。

35

代码

#include<iostream>
#include<vector> 
using namespace std;

vector <int> add(vector <int>&A,vector <int>&B){
	if(A.size()<B.size()) return (B,A);
	vector <int>C;
	int t=0;//t表示进位 
	for(int i=0;i<A.size();i++){
		t+=A[i];//t加上A[i] 
		if(i<B.size())t+=B[i];//A[i]+B[i]+t
		C.push_back(t%10);//存C[i] 
		t/=10;//C[i+1]的进位 
	}
	if (t) C.push_back(t);
	return C;
}
int main(){
	string a,b;
	cin>>a>>b;
	vector<int> A,B;
	//存储大数a 
	for(int i=a.size()-1;i>=0;i--){
		A.push_back(a[i]-'0');
	}
	//存储大数b 
	for(int i=b.size()-1;i>=0;i--){
		B.push_back(b[i]-'0');
	}
	vector<int> C=add(A,B);
	//输出结果C[i] 
	for(int i=C.size()-1;i>=0;i--){
		cout<<C[i];
	}
	
	return 0;
}

高精度减法

// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); 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;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing

题目练习

[题目链接]()
给定两个正整数,计算它们的差,计算结果可能为负数。
1≤整数长度≤105

输入

共两行,每行包含一个整数。

32
11

输出

共一行,包含所求的差。

21

代码

#include<iostream>
#include<vector> 
using namespace std;
//比较A和B哪个数更大 
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 true;
}
// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int>&A,vector<int>&B){
	vector<int> C;
  	for (int i = 0, t = 0; i < A.size(); 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();//前导0 
	
    return C;
}
int main(){
	string a,b;
	cin>>a>>b;
	vector<int> A,B;
	//存储大数a 
	for(int i=a.size()-1;i>=0;i--){
		A.push_back(a[i]-'0');
	}
	//存储大数b 
	for(int i=b.size()-1;i>=0;i--){
		B.push_back(b[i]-'0');
	}
	if(cmp(A,B)){
		auto C=sub(A,B);
		for(int i=C.size()-1;i>=0;i--)cout<<C[i];
		
	
	}else{
		auto C=sub(B,A);
		cout<<"-";
		for(int i=C.size()-1;i>=0;i--)cout<<C[i];
		
	}
	
	//输出结果C[i] 
	
	
	
	return 0;
} 

高精度乘法

// C = A * b, A >= 0, b > 0
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;

    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }

    while (C.size() > 1 && C.back() == 0) C.pop_back();

    return C;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing

高精度除法

// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

作者:yxc
链接:https://www.acwing.com/blog/content/277/
来源:AcWing