顾得泉:个人主页
个人专栏:《Linux操作系统》 《C++从入门到精通》 《LeedCode刷题》
键盘敲烂,年薪百万!
一、高精度加法
1.实现思路
函数首先检查数组A和B的大小关系,如果A的大小小于B的大小,则交换A和B的顺序,确保A是较长的数组。
然后,创建一个空的整数数组C,用于存储相加的结果。
接下来,使用一个循环遍历数组A的元素。在每次迭代中,将当前位置的元素值与变量t相加,t初始值为0。如果当前位置小于数组B的大小,则将数组B对应位置的元素值也加到t上。
然后,将t对10取模的结果添加到数组C中,表示当前位的和。接着,将t除以10,以便处理下一位的进位。
最后,如果t不为0(即还有进位),则将其添加到数组C的末尾。函数返回数组C作为结果。
注意,这段代码假设输入的数组A和B都是非负整数数组,且每个元素都在0到9之间。
2.核心代码
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;
}
3.测试运行
main函数内容,仔细体会其中的奥秘!
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> res = add(A, B);
reverse(res.begin(), res.end());
for (auto s : res)
cout << s;
return 0;
}
测试结果:
二、高精度减法
1.实现思路
函数首先创建一个空的整数数组C,用于存储相减的结果。
接下来,使用一个循环遍历数组A的元素。在每次迭代中,将当前位置的元素值与变量t相减,t初始值为0。如果当前位置小于数组B的大小,则将数组B对应位置的元素值也从t中减去。
然后,将t加上10再对10取模的结果添加到数组C中,表示当前位的差值。这样做是为了处理借位的情况。
接着,根据t的值判断是否有借位。如果t小于0,说明有借位,将t设置为1;否则,将t设置为0。
最后,通过循环移除数组C末尾的0元素,直到C的大小为1或最后一个元素不为0。函数返回数组C作为结果。
2.核心代码
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);
if (t < 0)
t = 1;
else
t = 0;
}
while (C.size() > 1 && C.back() == 0)
C.pop_back();
return C;
}
3.测试运行
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> res = sub(A, B);
reverse(res.begin(), res.end());
for (auto s : res)
cout << s;
return 0;
}
测试结果:
三、高精度乘法
1.实现思路
函数首先创建一个空的整数数组C,用于存储相乘的结果。
接下来,使用一个循环遍历数组A的元素。在每次迭代中,如果当前位置小于数组A的大小,则将数组A对应位置的元素值乘以整数b,并将结果累加到变量t中。
然后,将t对10取模的结果添加到数组C中,表示当前位的乘积。接着,将t除以10,以便处理进位。
最后,通过循环移除数组C末尾的0元素,直到C的大小为1或最后一个元素不为0。函数返回数组C作为结果。
2.核心代码
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;
}
3.测试运行
int main()
{
string a;
int b, t;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int> res = mul(A, b);
reverse(res.begin(), res.end());
for (auto s : res)
cout << s;
return 0;
}
测试结果:
四、高精度除法
1.实现思路
函数首先创建一个空的整数数组C,用于存储相除的结果。
接下来,使用一个循环从数组A的末尾开始遍历元素。在每次迭代中,将变量t乘以10再加上当前位置的元素值,然后将t除以整数b,并将商添加到数组C中。接着,将t对b取模,以便处理余数。
然后,通过调用reverse函数将数组C反转,使其顺序与原始数组A一致。
最后,通过循环移除数组C末尾的0元素,直到C的大小为1或最后一个元素不为0。函数返回数组C作为结果。
2.核心代码
vector<int> div(vector<int> A, int b)
{
vector<int> C;
int t = 0;
for (int i = A.size() - 1; i >= 0; i--)
{
t = t * 10 + A[i];
C.push_back(t / b);
t %= b;
}
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0)
C.pop_back();
return C;
}
3.测试运行
int main()
{
string a;
int b, t;
cin >> a >> b;
vector<int> A;
for (int i = a.size() - 1; i >= 0; i--)
A.push_back(a[i] - '0');
vector<int> res = div(A, b);
reverse(res.begin(), res.end());
for (auto s : res)
cout << s;
return 0;
}
测试结果:
结语:C++关于高精度问题的分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~