• 【算法】高精度加、减、乘、除(C++实现)


    一、高精度

      当然在java中,进行高精度的加法、减法、乘法、除法运算的时候,可以通过java.math包中提供的BigInteger类提供的的方法来进行计算:

    • 加法:a.add(b);表示a+b
    • 减法:a.subtract(b);表示a-b
    • 乘法:a.multiply(b);表示a*b
    • 除法:a.divide(b);表示a/b并取整
    • 取余:a.remainder(b);表示a%b
    • 除法取余:BigInteger c[]=a.divideAndRemainder(b); a除b的商给 c[0],余数给c[1]
    • 最大公约数:a.gcd(b); a与b的最大公约数
    • 绝对值:a.abs(); 对a取绝对值
    • 取相反数:a.negate(); 对a取相反数
    • 取幂值:a.pow(n); 求a的n次方

    二、高精度加法:

      给定两个正整数,计算它们的和。

       vector是stl里的动态数组,动态数组是模板库中的一个类,当元素的个数大于等于数组的大小的时候,数组的大小会变成原来的两倍,系统会从另一片区域中找出一块原来的数组的内存的两倍的空间,之后再把原来的数组拷贝到新的数组中。

       为什么用a[i]-‘0’?因为ASCII中的0-9对应48-57,但我们计算的时候想要数字,而不是它的ASCII码。所以必须让0变为0,1变为1以此类推…


                              ’0‘ - ’0‘ = 0 –> 48 - 48 = 0
                              ‘1’ - ‘0’ = 1 –> 49 - 48 = 1

    1. #include
    2. #include
    3. using namespace std;
    4. const int N=1e6+10;
    5. vector<int> add(vector<int> &A,vector<int> &B)
    6. {
    7. vector<int> C;
    8. int t=0;//设置进位,初始为0
    9. for(int i=0;isize() or isize();i++)
    10. {
    11. if(isize()) t+=A[i];
    12. if(isize()) t+=B[i];
    13. //以上两步进行完后,t=上一轮加法的进位已经这一轮ab的和
    14. C.push_back(t%10);
    15. t/=10;
    16. }
    17. if(t) C.push_back(1); //最终t仍为1发生进位
    18. return C;
    19. }
    20. int main()
    21. {
    22. string a,b;//a,b太大所以用字符串形式写入
    23. vector<int> A,B;
    24. cin>>a>>b;
    25. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0'); //将a[i]转换为int型,并从个位开始读入方便进位
    26. for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0'); //将b[i]转换为int型
    27. auto C=add(A,B); //auto编译器自动判断类型
    28. for(int i=C.size()-1;i>=0;i--) cout<
    29. }

    三、高精度减法

     

    1. #include
    2. #include
    3. using namespace std;
    4. //判断A是否大于等于B
    5. bool cmp(vector<int> &A, vector<int> &B)
    6. {
    7. if(A.size()!=B.size()) return A.size()>B.size();
    8. for(int i=A.size()-1; i>=0; i-- )
    9. if(A[i]!=B[i])
    10. return A[i]>B[i];
    11. return true;
    12. }
    13. //C=A-B
    14. vector<int> sub(vector<int> &A,vector<int> &B)
    15. {
    16. vector<int> C;
    17. for(int i=0,t=0; isize(); i++)
    18. {
    19. t =A[i]-t;
    20. if(isize()) t-=B[i];
    21. C.push_back((t+10)%10);
    22. if(t<0) t=1;
    23. else t=0;
    24. }
    25. while(C.size()>1 and C.back()==0) C.pop_back();//去除前导0 (002 001)
    26. return C;
    27. }
    28. int main()
    29. {
    30. string a,b;
    31. vector<int> A,B;
    32. cin>>a>>b;
    33. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    34. for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
    35. vector<int> C;
    36. if(cmp(A,B))
    37. {
    38. //判断A是否大于B
    39. auto C=sub(A,B);
    40. for(int i=C.size()-1;i>=0;i--) cout<
    41. }
    42. else{
    43. auto C=sub(B,A);
    44. cout<<"-";
    45. for(int i=C.size()-1;i>=0;i--) cout<
    46. }
    47. }

    四、高精度乘法

     

    1. #include
    2. #include
    3. using namespace std;
    4. vector<int> mul(vector<int> &A,int b){
    5. vector<int> C;
    6. int t=0;
    7. for(int i=0;isize() or t;i++)
    8. {
    9. if(isize()) t+=A[i]*b;
    10. C.push_back(t%10);
    11. t/=10;
    12. }
    13. while(C.size()>1 and C.back()==0) C.pop_back();//去除前置0
    14. return C;
    15. }
    16. int main()
    17. {
    18. string a;
    19. int b;
    20. cin>>a>>b;
    21. vector<int> A;
    22. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    23. auto C=mul(A,b);
    24. for(int i=C.size()-1;i>=0;i--) cout<
    25. return 0;
    26. }

    五、高精度除法

     

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. //A/b,商是c余数是r
    6. vector<int> div(vector<int> &A,int b,int &r)
    7. {
    8. vector<int> C;
    9. r=0;
    10. for(int i=A.size()-1;i>=0;i--)
    11. {
    12. r=r*10+A[i];
    13. C.push_back(r/b);
    14. r%=b;
    15. }
    16. reverse(C.begin(),C.end());
    17. while(C.size()>1 and C.back() ==0) C.pop_back();
    18. return C;
    19. }
    20. int main()
    21. {
    22. string a;
    23. int b;
    24. cin>>a>>b;
    25. vector<int> A;
    26. for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    27. int r;
    28. auto C=div(A,b,r);
    29. for(int i=C.size()-1;i>=0;i--) cout<
    30. cout<
    31. cout<
    32. return 0;
    33. }

  • 相关阅读:
    kafka无法启动的问题
    ContentServiceImpl
    flask-sqlalchemy 绑定多个数据库并实现多数据库迁移
    Android入门第31天-Android里的ViewFlipper翻转视图的使用
    系统架构师考试科目一:综合知识
    EasyExcel导入导出
    【华为OD机试真题 JS】贪吃蛇
    Node学习笔记之Node简介
    面试整理(不断更新)
    NotePad++安装一些插件的使用
  • 原文地址:https://blog.csdn.net/m0_67463447/article/details/127825718