加法
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> Add(vector<int>A, vector<int>B);
int main()
{
string a, b;
vector<int>A, B;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
auto C = Add(A, B);//auto编译器会自动识别返回的类型
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0;
}
vector<int> Add(vector<int>A, vector<int>B)
{
vector<int>C;
int t = 0;
int i = 0, j = 0;
while (i < A.size() || j < B.size()) {
if(i<A.size()) t += A[i++];
if (j < B.size())t += B[j++];;
C.push_back(t % 10);
t /= 10;
}
if (t) C.push_back(t);//这一步不要忘了
return C;
}
减法
这个只是基础的正整数与正整数的加减,如果不全都正整数,因题意进行改变
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> Sub(vector<int>A, vector<int>B);
int main()
{
string a, b;
cin >> a >> b;
vector<int>A, B;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i--)
B.push_back(b[i] - '0');
vector<int> C = Sub(A, B);
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0;
}
vector<int> Sub(vector<int>A, vector<int>B)
//上面这种写法相当于是把A,B赋值进函数
//vector<int> Sub(vector<int> &A, vector<int> &B)这样是直接传入地址,效率更高
{
vector<int>C;
int t=0;
int i = 0;
if (B.size() > A.size()) {
cout << "-";
return Sub(B, A);
}
else if(B.size()==A.size())
{
int p = B.size() - 1;
while (p >= 0)
{
if (B[p] > A[p]) {
cout << "-";
return Sub(B, A);
}
else if(B[p]<A[p])
break;
p--;
}
}
while (i < A.size())//默认A数字大
{
t = A[i] - t;
int sign = 0;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);
if (t < 0) t = 1;//借位了
else t = 0;
i++;
}
i --;
while (i > 0 && C[i--] == 0) {
//把除了个位在第一位非0数前面的数全部去掉
//比如99-100=-001=-1
C.pop_back();
}
return C;
}
乘法–高精度乘低精度
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> Mul(vector<int>A, long long b);
int main()
{
string a;
long long b;
cin >> a >> b;
vector<int>A;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int>C = Mul(A, b);
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0;
}
vector<int> Mul(vector<int>A, long long b)
{
vector<int>C;
int t = 0;
int i;
for (i = 0; i < A.size()||t; i++)//当A里面每一位数都与b乘过后,t进位还剩,继续存入
{
if(i<A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
i--;
while (i > 0 && C[i--] == 0) C.pop_back();
//排除1234*0000=0000
return C;
}
除法–高精度除以低精度
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<int> Div(string A, long long b, long long& r);
int main()
{
string a;
long long b, r = 0;//r是余数
cin >> a >> b;
vector<int>C = Div(a, b, r);
for (int i = C.size()-1; i >= 0; i--)
cout << C[i];
cout << endl << r;
return 0;
}
vector<int> Div(string a, long long b, long long& r)
{
//其他三种高精度都是从尾巴到头处理,除法是先处理头部
vector<int>C;
int i;
for (i = 0; i < a.size();i++)
{
if(i<a.size()) r = r * 10 + (a[i]-'0');
C.push_back(r / b);
r %= b;
}
i--;
reverse(C.begin(), C.end());//要去掉开头的0
while (i > 0 && C[i--] == 0) C.pop_back();
return C;
}