基础算法高精度 ACWING习题 C/C++

9 篇文章 0 订阅

基础算法

高精度

1.791. 高精度加法

  • 题目描述

    • 在这里插入图片描述
  • 思路

    • 在这里插入图片描述
  • 代码

    • #include<iostream>
      #include<algorithm>
      #include<cstring>
      #include<cstdio>
      #include<vector>
      
      using namespace std;
      
      const int N = 1e6 + 10;
      
      vector<int> add(vector<int> &A , vector<int> &B){
      
         vector<int> C;
      
         int t = 0;  //t表示进位
         for(int i = 0 ; i < A.size() || i < B.size() ; i++){
      
           if(i < A.size()) t += A[i];
           if(i < B.size()) t += B[i];
          //此时 t = 当前位数的加和 + 进位
           C.push_back(t % 10);
          //如果 t / 10 = 1,就代表下一位需要进位1
           t /= 10;
         }
         // ex: 12 + 90 避免第三位数 102中的1 被遗漏
         if(t) C.push_back(1);
         return C;
      
      }
      
      int main(){
      
        string a , b;
        vector<int> A , B ;
      
        cin >> a >> b; // a = "123456"
      
        //逆序遍历
        for(int i = a.size()-1 ; i >=0 ; i--) A.push_back(a[i] - '0');  //A = [6,5,4,3,2,1]
        for(int i = b.size()-1 ; i >=0 ; i--) B.push_back(b[i] - '0');
      
        vector<int> C = add(A,B);
      
        for(int i = C.size() - 1 ; i >=0 ; i--) printf("%d" , C[i]);
      
        return 0;
      }
      
      

2.792. 高精度减法

  • 题目描述

    • 在这里插入图片描述
  • 思路

    • 在这里插入图片描述
  • 代码

    • #include<iostream>
      #include<vector>
      
      using namespace std;
      
      
      //我们假定的A 与 B 都是正数
      
      //用于判断A B大小的函数
      bool cmp(vector<int> &A , vector<int> &B){
      
           if(A.size() != B.size()) return A.size() > B.size();
      
           for(int i = A.size() - 1 ; i >= 0 ; i--)
                  if(A[i] != B[i])
                      return A[i] > B[i];
      
      
           return true;
      }
      
      //C = A - B
      vector<int> sub(vector<int> &A , vector<int> &B){
      
         vector<int> C;
         //从个位开始减
         for(int i = 0 , t = 0; i < A.size() ; i++){
              //如果上一位借位了 ,那当前位就需要减去t
              t = A[i] - t;
              if(i < B.size()) t -= B[i];
              C.push_back((t + 10) % 10);
              //t小于0 就代表需要借位
              if( t < 0) t = 1;
              else t = 0;
      
         }
      
         while(C.size() > 1 && C.back() == 0) C.pop_back(); //去掉前导 0  ex 003 -> 3
      
         return C;
      }
      
      int main(){
      
        string a , b;
        vector<int> A , B ;
      
        cin >> a >> b; // a = "123456"
      
        //逆序遍历
        for(int i = a.size()-1 ; i >=0 ; i--) A.push_back(a[i] - '0');  //A = [6,5,4,3,2,1]
        for(int i = b.size()-1 ; i >=0 ; i--) B.push_back(b[i] - '0');
      
        //比较 A 与 B 的数字大小
        if(cmp(A,B)){
      
           vector<int> C = sub(A,B);
      
           for(int i = C.size() - 1 ; i >= 0 ; i --) printf("%d" , C[i]);
        }
        else{
      
           vector<int> C = sub(B,A);
      
           printf("-");
           for(int i = C.size() - 1 ; i >= 0 ; i--) printf("%d" , C[i]);
        }
      
      
        return 0;
      }
      
      
      

3.793. 高精度乘法

  • 题目描述

    • 在这里插入图片描述
  • 思路

    • 在这里插入图片描述
  • 代码

    • #include<iostream>
      #include<cstring>
      #include<cstdio>
      #include<algorithm>
      #include<vector>
      
      using namespace std;
      
      C = A * B
      vector<int> mul(vector<int> &A , int b){
      
         vector<int> C;
      
         int t = 0;  //表示进位
         //ex : 12 * 9 = 108 防止因为迭代次数缺少 , 而无法显示 1
         for(int i = 0 ; i < A.size() || t  ; i++){
            //判断是否枚举完
            if( i < A.size()) t += A[i] * b;
            C.push_back(t % 10);
            t /= 10;
      
         }
        //去掉前导0
        while (C.size() > 1 && C.back() == 0) C.pop_back();
          return C;
      }
      
      int main(){
      
         string a;
         int b;
         cin >> a >> b;
      
         vector<int> A;
         for(int i = a.size() - 1 ; i >= 0 ; i--) A.push_back(a[i] - '0'); //字符数组转整数
      
         vector<int> C = mul(A,b);
      
         for(int i = C.size() - 1 ; i >= 0 ; i--) printf("%d" , C[i]);
      
         return 0;
      }
      
      

4.794. 高精度除法

  • 题目描述

    • 在这里插入图片描述
  • 思路

    • 在这里插入图片描述
  • 代码

    • #include<iostream>
      #include<cstring>
      #include<cstdio>
      #include<algorithm>
      #include<vector>
      
      using namespace std;
      
      //r表示余数  A/b, 商是C ,余数是 r , 除法需要从最高位开始算
      vector<int> div(vector<int> &A , int b ,int &r){
          vector<int> C;
          r = 0;
      
          for(int i = A.size() - 1 ; i >= 0 ; i--){
             r = r * 10 + A[i];  //上一位的余数乘以10 加上 当前位数A[i]
             C.push_back(r/b);
             r %= b;
          }
      
          reverse(C.begin(),C.end());
      
          //消除前导0
          while(C.size() > 1 &&  C.back() == 0) C.pop_back();
      
          return C;
      }
      
      int main(){
      
         string a;
         int b;
         cin >> a >> b;
      
         vector<int> A;
         for(int i = a.size() - 1 ; i >= 0 ; i--) A.push_back(a[i] - '0'); //字符数组转整数
      
         int r ;
         vector<int> C = div(A,b,r);
      
         for(int i = C.size() - 1 ; i >= 0 ; i--) printf("%d" , C[i]);
         cout << endl << r << endl;
      
         return 0;
      }
      
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值