大数运算(高精度运算)

高精度运算

1、高精度加法

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

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的和。

数据范围
1≤整数长度≤100000
输入样例:
12
23
输出样例:
35

#include
#include
#include
using namespace std;
typedef long long LL;
vector<int> a,b,res;
string m,n;
int main()
{
    cin >> m >> n;
    for(int i=m.size()-1;i>=0;i--)
        a.push_back(m[i]-'0');
    for(int i=n.size()-1;i>=0;i--)
        b.push_back(n[i]-'0');
    int t=0;
    int i=0;
    while(i<a.size()||i<b.size()||t)
    {
        if(i<a.size())  t+=a[i];
        if(i<b.size())  t+=b[i];
        res.push_back(t%10);
        if(t>=10)   t=1;
        else    t=0;
        i++;
    }
    for(int i=res.size()-1;i>=0;i--)
        printf("%d",res[i]);
    return 0;
}

2、高精度减法

给定两个正整数,计算它们的差,计算结果可能为负数。

输入格式
共两行,每行包含一个整数。

输出格式
共一行,包含所求的差。

数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21

#include
#include
#include

using namespace std;

string a,b;
vector<int> m,n,res;

bool judge(vector<int> a,vector<int> b)
{
    if(a.size()==b.size())
    {
        for(int i=0;i<a.size();i++)
            if(a[i]!=b[i])
                return a[i]>b[i];
    }
    else    
        return a.size()>b.size();
    return true;
}


void minu(vector<int> a,vector<int> b)
{
    int t=0;
    for(int i=0;i<a.size();i++)
    {
        t=a[i]-t;
        if(i<b.size())  t-=b[i];
        res.push_back((t+10)%10);
        if(t<0) t=1;
        else    t=0;
    }
    while(res.size()>1&&res.back()==0)  res.pop_back();
}



int main()
{
    cin>> a >> b;
    for(int i=a.size()-1;i>=0;i--)  m.push_back(a[i]-'0');
    for(int i=b.size()-1;i>=0;i--)  n.push_back(b[i]-'0');
    
    if(!judge(m,n))
    {
        printf("-");
        minu(n,m);
    }
    else
        minu(m,n);
    for(int i=res.size()-1;i>=0;i--)    printf("%d",res[i]);
    return 0;
}

3、高精度乘法

给定两个正整数A和B,请你计算A * B的值。

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

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

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

#include
#include
#include

using namespace std;

vector<int> a,res;
int n;
string m;

void mul(vector<int> a,int b)
{
    int t=0;
    for(int i=0;i<a.size();i++)
    {
        t+=a[i]*b;
        res.push_back(t%10);
        t/=10;
    }
    while(t)
    {
        res.push_back(t%10);
        t/=10;
    }
}



int main()
{
    cin >> m >> n;
    for(int i=m.size()-1;i>=0;i--)  a.push_back(m[i]-'0');
    
    mul(a,n);
    for(int i=res.size()-1;i>=0;i--)    printf("%d",res[i]);
    return 0;
}

4、高精度除法

给定两个正整数A,B,请你计算 A / B的商和余数。

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

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

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

#include
#include
#include

using namespace std;

vector<int> a,res;
string m;
int n,t;

void divide(vector<int> a,int b)
{
    t=0;
    for(int i=0;i<a.size();i++)
    {
        t=t*10+a[i];
        res.push_back(t/b);
        t=t%b;
    }
    reverse(res.begin(),res.end());
    while(res.size()>1&&res.back()==0)  res.pop_back();
}


int main()
{
    cin >> m >> n;
    for(int i=0;i<m.size();i++) a.push_back(m[i]-'0');
    
    divide(a,n);
    for(int i=res.size()-1;i>=0;i--)    printf("%d",res[i]);
    printf("\n%d",t);
    return 0;
}

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