高精度乘除法

原题链接
https://www.acwing.com/problem/content/795/

乘法

题目描述

给定两个整数 A(A>0) 和 B(>=0),请你计算 A×B 的值。

输入格式

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

输出格式

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

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

2
3

输出样例:

6

思路:
这里是大数乘小数,我们采取的方法是,首先大数的每一位跟小数整体相乘,然后得到的数%10,即对10取模,即是结果的数,然后除10,就是进位;
高精度乘除法_第1张图片
代码实现:

#include
#include

using namespace std;

vector<int> mul(vector<int> &A,int b)
{
    vector<int> C;
    int t=0;//进位
    for(int i=0;i<A.size();i++)
    {
        t += A[i] * b;
        C.push_back(t%10);
        t /= 10;
    }
    if(t) C.push_back(t);
    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');
    if(b)
    {   
        auto c=mul(A,b);
        for(int i = c.size()-1;i >= 0;i--)
        {
            printf("%d",c[i]);
        }
    }
    else printf("%d",0);
    
    return 0;
}

除法

原题链接https://www.acwing.com/problem/content/description/796/

题目描述

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

输入格式

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

输出格式

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

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

7
2

输出样例:

3
1

思路:
其实数据的存储与之前加法,减法,乘法都是一样的,这里我们要思考怎么进行除。
这里是要保留余数的,余数10+当前的数就是下一步的要处理的数。我们除以这个数;关键点就是余数10+当前数;
代码实现:

#include
#include
#include
#include

using namespace std;

vector<int> div(vector<int> &A,int b, int &r)
{
    vector<int> C;
    for(int i=A.size()-1;i>=0;i--)
    {
        r = r *10+A[i];//余数
        C.push_back(r/b);//结果每位的数
        r %= b;//余数更新
    }
    reverse(C.begin(),C.end());//翻转
    while(C.size()>1&&C.back()==0) C.pop_back();//除去前导0
    return C;
}
int main()
{
    string a;
    int b;
    vector<int> A;
    cin>>a>>b;//12345
    for(int i=a.size()-1;i>=0;i--)
        A.push_back(a[i]-'0');
    int r=0;   //r采用的是引用参数
    vector<int> c = div(A,b,r);
    for(int i=c.size()-1;i>=0;i--)
        printf("%d",c[i]);
        printf("\n");
        printf("%d",r);
    return 0;
}

总结:
1,这里乘法,除法,我们看到就是模拟,所以我们不需要去证明什么,我们只需要去理解,然后记住这种处理技巧;
2,c.push_back()就类似入栈一样,在后面逐个追加;c.pop_back()就类似于出栈一样,从后面开始除去;c.back()返回最后尾元素的值;c.end()尾元素的下一个位置;

你可能感兴趣的:(基础算法,算法,c++)