当计算位数超过最大存储范围时,无法正常存储而使用数组来存储数据
读取
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.putsh_back(b[i] - '0');
加法
不考虑A
、B
为负数情况
vector<int> add(vector<int>& A, vector<int>& B)//取地址速度更快,避免复制占用时间
{
if (A.size() > B.size()) return add(B, A); //始终保证A的长度大于等于B的长度
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;
}
减法
这个模板前提是A
、B
都为正数,当然也可以扩展为可以计算负数的情况,只需要对输入输出特殊处理
计算前需要先判断A
,B
大小,如果 A-B<0
计算 b-a
,ans=-(b-a)
bool cmp(vector<int>& A, vector<int>B)
{
if (A.size() != B.size()) return A.size() > B.size();
for (int i = 0; i < A.size(); i++)
if (A[i] != B[i]) return A[i] > B[i];
return true;//相等返回true
}
vector<int> sub(vector<int>& A, vector<int>& B)
{
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i++)
{
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10); //如果t<0,t=t+10,如果t>=0,t=t
//判断是否需要借位
if (t < 0) t = 1;
else t = 0;
}
//处理前导零
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
乘法
使用前提,一个很长的整数乘一个较小的整数
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;
}
除法
使用前提,一个很长的整数除一个较小的整数
vector<int> div(vector<int>& A, int b, int& r) //A除b,余数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;
}
//存储时习惯低位在前,所以翻转C
reverse(C.begin(), C.end());
//处理前导零
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
标签:10,return,高精度,int,back,vector,size From: https://www.cnblogs.com/mpmp/p/17063025.html