• 高精度乘除法(超详细)


    高精度乘除法(超详细)

    题目1-高精度乘法

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

    输入格式
    共两行,第一行包含整数 A,第二行包含整数 B。

    输出格式
    共一行,包含 A×B 的值。

    数据范围
    1≤A的长度≤100000,
    0≤B≤10000
    输入样例:
    2
    3
    输出样例:
    6

    //算法思想:乘法比较简单,只要掌握乘法的原理,进行调试即可。
    
    #include
    #include
    #include
    #include
    #include
    
    using namespace std;
    
    vector<int> cheng(vector<int> A,int b){
    
        vector<int> C;
        int c=0;
        for(int i=A.size()-1;i>=0;i--){
            c=c+A[i]*b;
            C.push_back(c%10);
            c/=10;
        }
        if(c) C.push_back(c); //最高位如果存在的话,要写入C里面。
        while(C.size()!=1 && C.back()==0) C.pop_back();//把多余的零删除
        return C;
    }
    
    int main(){
    
        string a;
        cin>>a;
    
        vector<int> A;
        int b;
        cin>>b;
        for(int i=0;i<a.size();i++) A.push_back(a[i]-'0');
    
        vector<int> C;
    
        C=cheng(A,b);
    
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
        return 0;
    }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    算法思想:乘法比较简单,与普通的乘法不同,不论第二个被乘数是多大,有几位,都看成是一个只有一位的数。在计算的时候将第二个数当做只有一位的数进行计算。结果的每一位都是乘数的每一对与被乘数相乘对10取余。

    题目2 高精度除法

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

    输入格式
    共两行,第一行包含整数 A,第二行包含整数 B。

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

    数据范围
    1≤A的长度≤100000,
    1≤B≤10000,
    B 一定不为 0
    输入样例:
    7
    2
    输出样例:
    3
    1

    
    #include
    #include
    #include
    #include
    #include
    
    using namespace std;
    
    vector<int> div(vector<int> &A, int &b, int &r)
    {
        vector<int> C;
        r = 0;
        for (int i = 0; i<A.size(); i ++ )
        {
            r = r * 10 + A[i]; //每次将得到的余数乘以10之后再加上A的下一位A[i]
            C.push_back(r / b); //注意在这除的是b之后放到商
            r %= b;  //这里也是b,即重新计算余数r
        }
        reverse(C.begin(), C.end()); //为了与加减乘保持一致,同时也方便后面去0
        while (C.size() > 1 && C.back() == 0) C.pop_back();
        return C;
    }
    
    
    int main(){
    
        string a;
        cin>>a;
    
        vector<int> A;
        int b;
        cin>>b;
        int r=0;
    
        for(int i=0;i<a.size();i++) A.push_back(a[i]-'0');
    
        vector<int> C;
    
        C=div(A,b,r);
    
        for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    
        cout<<endl<<r;
        return 0;
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    算法思想:模拟实际上的除法的计算过程,每次得到的余数乘10之后再对b取余,以此类推。注意除法与加减乘不同,是从最高位开始算(与实际除法过程相符)。

  • 相关阅读:
    Leetcode 289. Game of Life
    使用单调栈解决接雨水问题——LeetCode 42 接雨水+单调栈说明
    主流定时任务解决方案全横评
    电池单体一致性云端算法整理
    1.Django安装和项目创建
    FOC控制之小A小B小C是如何追求小D的
    Vue全家桶 Vue-router的详细介绍
    NLP课程笔记-基于transformers的自然语言处理入门
    19 css 选择器用类名、节点名、id来获取节点内容
    sqli-labs复现
  • 原文地址:https://blog.csdn.net/s_m_c/article/details/132892048