持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第31天,点击查看活动详情
1、高精度
高精度运算指的是特别大的数字运算,int类型也就23亿左右,也就10个位数,但是高精度的数字可以达到10的6次幂个数字。这个时候高精度的数字就要使用数组来储存了。比如说数字123456789 存储在数组中应该是这样的:
vector[0]=9
vector[1]=8
vector[2]=7
vector[3]=6
...
vector[4]=1 之所以要把最高位的1放在最后,是因为这样在进位时我们只需要在数组后面插入1课,如果是vector[0]存储最高位,那么在进位时就要移动整个数组了。
2、加法
vector<int> add(vector<int> &A, vector<int> &B)
{
vector<int> C;
if (A.size() < B.size()) return add(B, A);//保证都好左边的大
int t = 0;//进位,每次相加都是A[i],B[i],t三个相加
for (int i = 0; i < A.size(); i++) {//以大的为基准进行行相加
t += A[i];//先加A[i]
if (i < B.size()) t += B[i];//如果B[i]还有的话就
C.push_back(t % 10);//余数新数组
t /= 10;//进位数t==1或t==0
}
if (t) C.push_back(1);//最高位还要进位就在就把1压入栈内
return C;
}
3、减法
需要注意的是我们希望是大的数减去小的数,所以再见之前还要去判断一下谁大
bool cmp(vector<int> &A, vector<int> &B)//判断的是A>=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;//A==B返回真
}
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;//t前一位借走的
if (i < B.size()) t -= B[i];//B不能越位
C.push_back((t + 10) % 10);//合二为一,t不变
if (t < 0) t = 1;//t<0说明借一了,所以t=1,算下以为是要减去
else t = 0;//t==0就是没借
}
while (C.size() > 1 && C.back() == 0) C.pop_back();//去除前导零
//但是要把正结果为0
return C;
}
4、乘法
这里乘法是指一个高精度数成一个较小的数
vector<int> mul(vector<int> &A, int b)
{//高精度书乘以一个小一点的数。
vector<int> C;
int t = 0;//进位,t不只是一位数了,因为我们每次计算都是让A[i]*b,b虽然小但他的小时相对于高精度数的
for (int i = 0; i < A.size()||t; i++) {
if (i < A.size())
t += A[i] * b;
C.push_back(t % 10);
t /= 10;
}
return C;
}
5、测试
void test01()
{
string a, b;
vector<int> A, B;
cin >> a >> b;//a="123456"
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 = add(A, B);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
printf("\n");
/。减法测试
if (cmp(A, B))
{
vector<int> C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
}
else
{
vector<int> C = sub(B, A);
printf("-");
for (int i = C.size() - 1; i >= 0; i--)
printf("%d", C[i]);
printf("\n");
}
}
//乘法测试
void test03()
{
string a;
vector<int> A;
int b;
cin >> a >> b;//a="123456"
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--)
printf("%d", C[i]);
}