当前位置:首页 » 《关于电脑》 » 正文

C/C++组蓝桥杯---带你轻松解决高精度问题 | 模板

16 人参与  2024年03月29日 14:15  分类 : 《关于电脑》  评论

点击全文阅读


顾得泉:个人主页

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/87666.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1