当前位置:   article > 正文

【高精度算法】&【蓝桥杯备考训练】:高精度加法、高精度减法、高精度乘法、高精度除法【已更新完成】

【高精度算法】&【蓝桥杯备考训练】:高精度加法、高精度减法、高精度乘法、高精度除法【已更新完成】

目录

1、高精度加法

2、高精度减法

3、高精度乘法

4、高精度除法


1、高精度加法

给定两个正整数(不含前导 0),计算它们的和。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的和。

数据范围

1≤整数长度≤100000

输入样例:
  1. 12
  2. 23
输出样例:
35
思路:

vector数组中存储的一串数字是由低位到高位的(低位到高位好操作),t用来存储进位

代码:
  1. #include<iostream>
  2. using namespace std;
  3. #include<string>
  4. #include<vector>
  5. vector<int> add(vector<int> &A,vector<int> &B)
  6. {
  7. if(A.size()<B.size())return add(B,A);
  8. vector<int>C;
  9. int t=0;
  10. for(int i=0;i<A.size();i++)
  11. {
  12. t=t+A[i];
  13. if(i<B.size())t=t+B[i];
  14. C.push_back(t%10);
  15. t=t/10;
  16. }
  17. if(t)C.push_back(t);
  18. return C;
  19. }
  20. int main()
  21. {
  22. string a,b;
  23. cin>>a>>b;
  24. vector<int>A,B;
  25. for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
  26. for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
  27. vector<int>res=add(A,B);
  28. for(int i=res.size()-1;i>=0;i--)cout<<res[i];
  29. return 0;
  30. }

2、高精度减法

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤1e5

输入样例:
  1. 32
  2. 11
输出样例:
21
思路:

先比较两个数的大小,总是用大数减小数,如果是结果负数的情况结果res=-(B-A)

代码:
  1. #include<iostream>
  2. using namespace std;
  3. #include<string>
  4. #include<vector>
  5. //judge if A>=B
  6. bool cmp(vector<int> A,vector<int> B)
  7. {
  8. if(A.size()!=B.size())return A.size()>B.size();
  9. //the position that A.size()==B.size()
  10. else
  11. {
  12. for(int i=A.size()-1;i>=0;i--)
  13. {
  14. if(A[i]!=B[i])return A[i]>B[i];
  15. }
  16. return true;
  17. }
  18. }
  19. vector<int> sub(vector<int> &A,vector<int> &B)
  20. {
  21. //now A is always bigger than B or equal to B
  22. vector<int>C;
  23. int t=0;
  24. for(int i=0;i<A.size();i++)
  25. {
  26. if(i<B.size())t=A[i]-B[i]-t;
  27. else t=A[i]-t;
  28. C.push_back((t+10)%10);
  29. if(t<0)t=1;
  30. else t=0;
  31. }
  32. while(C.size()>1 && C.back()==0)C.pop_back();
  33. return C;
  34. }
  35. int main()
  36. {
  37. string a,b;
  38. cin>>a>>b;
  39. vector<int>A,B;
  40. for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
  41. for(int i=b.size()-1;i>=0;i--)B.push_back(b[i]-'0');
  42. if(cmp(A,B))
  43. {
  44. vector<int>res=sub(A,B);
  45. for(int i=res.size()-1;i>=0;i--)cout<<res[i];
  46. }
  47. else
  48. {
  49. vector<int>res=sub(B,A);
  50. cout<<"-";
  51. for(int i=res.size()-1;i>=0;i--)cout<<res[i];
  52. }
  53. return 0;
  54. }

3、高精度乘法

给定两个非负整数(不含前导 0) A和 B,请你计算 A×B 的值。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式

共一行,包含 A×B 的值。

数据范围

1≤A的长度≤100000
0≤B≤100000

输入样例:
  1. 2
  2. 3
输出样例:
6
思路:

适用于一个大数乘一个小数,t用来存储进位

代码:
  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. vector<int> mul(vector<int> &A,int b)
  5. {
  6. vector<int>C;
  7. int t=0;
  8. for(int i=0;i<A.size() || t;i++)
  9. {
  10. if(i<A.size()) t+=A[i]*b;
  11. C.push_back(t%10);
  12. t/=10;
  13. }
  14. vector<int>s={0};
  15. if(C.back()!=0)return C;
  16. else return s;
  17. }
  18. int main()
  19. {
  20. string a;
  21. int b;
  22. cin>>a>>b;
  23. vector<int>A;
  24. for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
  25. auto C=mul(A,b);
  26. for(int i=C.size()-1;i>=0;i--)cout<<C[i];
  27. return 0;
  28. }

4、高精度除法

给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。

输入格式

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式

共两行,第一行输出所求的商,第二行输出所求余数。

数据范围

1≤A的长度≤100000
1≤B≤10000
B 一定不为 0

输入样例:
  1. 7
  2. 2
输出样例:
  1. 3
  2. 1
思路:

适用于大数除小数,r用来存储余数

代码:
  1. #include<iostream>
  2. using namespace std;
  3. #include<vector>
  4. #include<algorithm>
  5. vector<int> div(vector<int> &A,int b,int &r)
  6. {
  7. vector<int>C;
  8. r=0;
  9. for(int i=A.size()-1;i>=0;i--)
  10. {
  11. r=r*10+A[i];
  12. C.push_back(r/b);
  13. r%=b;
  14. }
  15. reverse(C.begin(),C.end());
  16. while(C.size()>1&&C.back()==0)C.pop_back();
  17. return C;
  18. }
  19. int main()
  20. {
  21. string a;
  22. int b,r;
  23. cin>>a>>b;
  24. vector<int>A;
  25. for(int i=a.size()-1;i>=0;i--)A.push_back(a[i]-'0');
  26. auto C=div(A,b,r);
  27. for(int i=C.size()-1;i>=0;i--)cout<<C[i];
  28. cout<<endl<<r<<endl;
  29. return 0;
  30. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/455839
推荐阅读
相关标签
  

闽ICP备14008679号