首页 > 其他 > 详细

高精度运算

时间:2021-05-02 21:47:26      阅读:20      评论:0      收藏:0      [点我收藏+]

高精度运算是我们在算法题中经常用到的一种题型,今天我来给大家分享一下高精度加减乘除的方法:

由于高精度类型题目用vector数组实现起来更为方便,所以我主要以vector数组来介绍高精度解决方法

高精度加法

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

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的和。

数据范围

11000001≤整数长度≤100000

输入样例:

12
23

输出样例:

35

#include<bits/stdc++.h>
using namespace std;
vector<int>add(vector<int> A,vector<int> B)
{
    if(A.size()<B.size()) return add(B,A);
    vector<int>C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t+=A[i];
        if(i<B.size()) t+=B[i];//vector数组与普通数组的一个区别是,vector数组只有在有值的情况下才能被访问
        C.push_back(t%10);
        t/=10;
    }
    if(t) C.push_back(t);
    return C;
}
int main()
{
    string a,b;
    vector<int> A,B,C;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)
        A.push_back(a[i]-0);
    for(int i=b.size()-1;i>=0;i--)
        B.push_back(b[i]-0);
    C=add(A,B);
    for(int i=C.size()-1;i>=0;i--)
        printf("%d",C[i]);
    return 0;
}

 

 

 

高精度减法

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

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

11051≤整数长度≤105

输入样例:

32
11

输出样例:

21


#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int> A,vector<int> B)//比较A和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;
}
vector<int>sub(vector<int> A,vector<int> B)
{
    vector<int>C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t=A[i]-t;
        if(i<B.size()) t-=B[i];
        C.push_back((t+10)%10);
        if(t<0) t=1;//相当于借位
        else t=0;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();//除去前导0
    return C;
}
int main()
{
    string a,b;
    vector<int> A,B,C;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)
        A.push_back(a[i]-0);
    for(int i=b.size()-1;i>=0;i--)
        B.push_back(b[i]-0);
    if(cmp(A,B)) C=sub(A,B);
    else C=sub(B,A),cout<<"-";
    for(int i=C.size()-1;i>=0;i--)
        printf("%d",C[i]);
    return 0;
}

 

高精度乘法

给定两个正整数 AA 和 BB,请你计算 A×BA×B 的值。

输入格式

共两行,第一行包含整数 AA,第二行包含整数 BB。

输出格式

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

数据范围

1A1000001≤A的长度≤100000,
0B100000≤B≤10000

输入样例:

2
3

输出样例:

6


#include<bits/stdc++.h>
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;
    }
    while(t) C.push_back(t%10),t/=10;
    while(C.size()>1&&C.back()==0) C.pop_back();//除去前导0
return C; } int main() { string a; vector<int> A,C; int b; cin>>a>>b; for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-0); C=mul(A,b); for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]); return 0; }

 

高精度除法

给定两个非负整数 ABA,B,请你计算 A/BA/B 的商和余数。

输入格式

共两行,第一行包含整数 AA,第二行包含整数 BB。

输出格式

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

数据范围

1A1000001≤A的长度≤100000,
1B100001≤B≤10000,
BB 一定不为 00

输入样例:

7
2

输出样例:

3
1


#include<bits/stdc++.h>
using namespace std;
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];
        C.push_back(r/b);
        r%=b;
    }
    reverse(C.begin(),C.end());//进行除法运算时是从高位到低位进行的,所以不能忘记反转
    while(C.size()>1&&C.back()==0) C.pop_back();
    return C;
}
int main()
{
    string a;
    vector<int> A,C;
    int b;
    cin>>a>>b;
    for(int i=a.size()-1;i>=0;i--)
        A.push_back(a[i]-0);
    int r;
    C=div(A,b,r);
    for(int i=C.size()-1;i>=0;i--)
        printf("%d",C[i]);
    printf("\n%d\n",r);
    return 0;
}

以上就是我分享的高精度运算方法了,希望大家能够喜欢!

 

高精度运算

原文:https://www.cnblogs.com/AC--Dream/p/14726342.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!