高精度加法

  1. /*
  2. 模板
  3. vector<int> add(vector<int> &A, vector<int> &B)
  4. {
  5. if (A.size() < B.size()) return add(B, A);
  6. vector<int> C;
  7. int t = 0;
  8. for (int i = 0; i < A.size(); i ++ )
  9. {
  10. t += A[i];
  11. if (i < B.size()) t += B[i];
  12. C.push_back(t % 10);
  13. t /= 10;
  14. }
  15. if (t) C.push_back(t);
  16. return C;
  17. }
  18. */
  19. #include<iostream>
  20. #include<string>
  21. #include <vector>
  22. #include<cstdio>
  23. using namespace std;
  24. // C = A + B, A >= 0, B >= 0
  25. vector<int> add(vector<int> &A,vector<int> &B)
  26. {
  27. vector<int> C;
  28. int t=0;
  29. for(int i=0;i<A.size()||i<B.size();i++)
  30. {
  31. if(i<A.size()) t+=A[i];
  32. if(i<B.size()) t+=B[i];
  33. C.push_back(t%10);
  34. t/=10;
  35. }
  36. if(t) C.push_back(t); //不要忘记我爱你,t或许是1
  37. return C;
  38. }
  39. int main()
  40. {
  41. string a,b;
  42. vector<int> A,B;
  43. cin>>a>>b;
  44. //下面要注意范围,记得减1,避免越界
  45. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
  46. for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
  47. auto C = add(A,B);
  48. //记得是倒序输出 思考一下
  49. for(int i=C.size()-1;i>=0;i--) cout<<C[i];
  50. return 0;
  51. }

高精度减法

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. //判断大小的函数
  7. bool cmp(vector<int> A,vector<int> B)
  8. {
  9. if(A.size()!=B.size()) return A.size() > B.size();
  10. for(int i=A.size()-1;i>=0;i--)
  11. if(A[i]!=B[i]) return A[i] > B[i];
  12. return true;
  13. }
  14. //高精度减法模板
  15. // C = A - B, 满足A >= B, A >= 0, B >= 0
  16. vector<int> sub(vector<int> &A,vector<int> &B)
  17. {
  18. vector<int> C;
  19. int len = A.size();
  20. int t=0;
  21. for(int i=0;i<len ;i++)
  22. {
  23. t+=A[i];
  24. if (i < B.size()) t -= B[i];
  25. C.push_back((t+10)%10); //这里很巧妙 ,就包括了t<0这种情况
  26. if(t<0) t=-1; //模拟进位
  27. else t=0;
  28. }
  29. while(C.size()>1&&C.back()==0) C.pop_back(); //记得除去前导零
  30. return C;
  31. }
  32. int main()
  33. {
  34. string a,b;
  35. vector<int>A,B;
  36. cin>>a>>b;
  37. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
  38. for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
  39. if(cmp(A,B)) //先判断大小,执行的是A-B;
  40. {
  41. auto C = sub(A,B);
  42. for(int i=C.size()-1;i>=0;i--) cout<<C[i];
  43. }
  44. else
  45. {
  46. auto C = sub(B,A);
  47. printf("-"); //如果A>B的话,加个符号就好啦
  48. for(int i=C.size()-1;i>=0;i--) cout<<C[i];
  49. }
  50. return 0;
  51. }

高精度乘法

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. //高精度乘法模板
  7. // C = A * b, A >= 0, b >= 0
  8. vector<int> mul(vector<int> A,int B)
  9. {
  10. int t=0;
  11. vector<int> C;
  12. for(int i=0;i< A.size()||t;i++)
  13. {
  14. if( i < A.size()) t += A[i]*B; //这个判断很妙
  15. C.push_back(t%10);
  16. t/=10;
  17. }
  18. while (C.size() > 1 && C.back() == 0) C.pop_back(); //0*1223 = 0 除去前导零
  19. return C;
  20. }
  21. int main()
  22. {
  23. string s;
  24. int b;
  25. vector<int> A;
  26. cin>>s>>b;
  27. for(int i=s.size()-1;i>=0;i--) A.push_back(s[i]-'0');//不要忘记减去0
  28. auto C = mul(A,b);
  29. for(int i=C.size()-1;i>=0;i--) cout<<C[i];
  30. return 0;
  31. }

高精度除法

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. using namespace std;
  6. //高精度除法模板
  7. // A / b = C ... r, A >= 0, b > 0
  8. vector<int> div(vector<int> A,int b,int &r)
  9. {
  10. vector<int> C;
  11. for(int i=A.size()-1;i>=0;i--)
  12. {
  13. r=r*10+A[i];
  14. C.push_back(r / b);
  15. r%=b;
  16. }
  17. reverse(C.begin(),C.end()); //反转一下,去前导零方便
  18. while(C.size()>1&&C.back()==0) C.pop_back();//除去前导零
  19. return C;
  20. }
  21. int main()
  22. {
  23. string a;int b;
  24. cin>>a>>b;
  25. vector<int> A;int r=0;//r是余数
  26. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
  27. auto C = div(A,b,r);
  28. for(int i=C.size()-1;i>=0;i--) cout<<C[i];
  29. cout<<endl<<r;
  30. return 0;
  31. }