高精度

基本思想


高精度问题是说当数字位数过多,超过long long的表示范围,如何实现这种超大数的加减乘除

代码模板


高精度加法

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

const int N=1e5+10;
char s1[N],s2[N];

void out(vector<int>&a)
{
    int n=a.size();
    for(int i=n-1;~i;i--)printf("%d",a[i]);
    printf("\n");
}

void add(vector<int>&a1, vector<int>&a2)
{
    int n1=a1.size(),n2=a2.size();
    for(int i=0,t=0;t||i<n1||i<n2;i++)
    {
        int a=i<n1?a1[i]:0;
        int b=i<n2?a2[i]:0;
        t+=a+b;
        if(i<n1)a1[i]=t%10;
        else a1.push_back(t%10);
        t/=10;
    }
}

int main()
{
    scanf("%s%s",s1,s2);
    
    vector<int> a1,a2;
    int n1=strlen(s1);
    for(int i=n1-1;~i;i--)a1.push_back(s1[i]-'0');
    int n2=strlen(s2);
    for(int i=n2-1;~i;i--)a2.push_back(s2[i]-'0');
    
    //out(a1),out(a2);
    add(a1,a2);
    int n=a1.size()-1;
    while(n>=0)printf("%d",a1[n--]);
    printf("\n");
    return 0;
}

高精度乘法

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

const int N=1e5+10;
char s[N];
int b;

void mul(vector<int>&a,int b)
{
    int n=a.size(),t=0;
    for(int i=0;t||i<n;i++)
    {
        int p=i<n?a[i]:0;
        t+=p*b;
        if(i<n)a[i]=t%10;
        else a.push_back(t%10);
        t/=10;
    }
    int i=a.size()-1;
    while(i&&!a[i--])a.pop_back();
}

void out(vector<int>&a)
{
    int n=a.size();
    for(int i=n-1;~i;i--)printf("%d",a[i]);
    printf("\n");
}

int main()
{
    scanf("%s%d",s,&b);
    int n=strlen(s);
    vector<int>a;
    for(int i=n-1;~i;i--)a.push_back(s[i]-'0');
    mul(a,b);
    out(a);
    return 0;
}

高精度减法

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;

const int N=1e5+10;
char s1[N],s2[N];

bool cmp(vector<int>&a,vector<int>&b)
{
    int n1=a.size(),n2=b.size();
    if(n1!=n2)return n1>n2;
    for(int i=n1-1;~i;i--) if(a[i]!=b[i]) return a[i]>b[i];
    return true;
}

void sub(vector<int>&a,vector<int>&b)
{
    int n1=a.size(),n2=b.size();
    int t=0,i;
    for(i=0;i<n1;i++)
    {
        t+=a[i];
        if(i<n2)t-=b[i];
        if(t<0)a[i]=t+10,t=-1;
        else a[i]=t,t=0;
    }
    i=n1-1;
    while(i&&a[i--]==0)a.pop_back();
}

void out(vector<int>&a)
{
    int n=a.size();
    for(int i=n-1;~i;i--)printf("%d",a[i]);
    printf("\n");
}

int main()
{
    scanf("%s%s",s1,s2);
    vector<int>a,b;
    int n1=strlen(s1),n2=strlen(s2);
    for(int i=n1-1;~i;i--)a.push_back(s1[i]-'0');
    for(int i=n2-1;~i;i--)b.push_back(s2[i]-'0');
    bool positive=true;
    if(cmp(a,b))sub(a,b);
    else positive=false,sub(b,a);
    if(positive)out(a);
    else {printf("-");out(b);};
    return 0;
}

高精度除法

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

const int N=1e5+10;
char s[N];

void div(vector<int>&c,int &r,vector<int>&a,int b)
{
    int n=a.size();
    for(int i=0;i<n;i++)
    {
        r=r*10+a[i];
        if(c.size()||(r/b))c.push_back(r/b);
        r%=b;
    }
    if(!c.size())c.push_back(0);
}

void out(vector<int>&a)
{
    int n=a.size();
    for(int i=0;i<n;i++)printf("%d",a[i]);
    printf("\n");
}

int main()
{
    int b;
    scanf("%s%d",s,&b);
    int n=strlen(s);
    vector<int>a;
    for(int i=0;i<n;i++)a.push_back(s[i]-'0');
    vector<int>c;
    int r=0;
    div(c,r,a,b);
    out(c);
    printf("%d\n",r);
    return 0;
}

应用场景


涉及到大数运算的题目

posted @ 2021-03-15 11:54  冰糖ryj  阅读(67)  评论(0编辑  收藏  举报