顾得泉:个人主页
个人专栏:《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;elset = 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++关于高精度问题的分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~