高精度相关模板

/*
高精度加法.
*/
#include<cstring>
#include<cstdio>
#include<iostream>
#define MAXN 10001
using namespace std;
int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
char m[MAXN],n[MAXN];
void slove()
{
    l3=max(l1,l2);
    for(int i=1;i<=l3;i++)
    {
        c[i]+=a[i]+b[i];
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    if(c[l3+1]) l3++;
    while(!c[l3]&&l3>1) l3--;
    for(int i=l3;i>=1;i--) printf("%d",c[i]);
}
int main()
{
    freopen("add.in","r",stdin);
    freopen("add.out","w",stdout);
    scanf("%s",m+1);l1=strlen(m+1);
    scanf("%s",n+1);l2=strlen(n+1);
    for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
    for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    slove();
    return 0;
}
/*
高精度减法.
*/
#include<cstring>
#include<cstdio>
#include<iostream>
#define MAXN 10001
using namespace std;
int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
char m[MAXN],n[MAXN];
void pre()
{
    if(l1>l2) 
    {
        for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    }
    else if(l1<l2){
        printf("-");
        for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
    }
    else if(strcmp(m+1,n+1)>=0)
    {
        for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    }
    else {
        printf("-");
        for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
    }
}
void slove()
{
    l3=max(l1,l2);
    for(int i=1;i<=l3;i++)
    {
        if(a[i]<b[i]) a[i+1]--,a[i]+=10;
        c[i]=a[i]-b[i];
    }
    while(!c[l3]&&l3>1) l3--;
    for(int i=l3;i>=1;i--) printf("%d",c[i]);
}
int main()
{
    freopen("sub.in","r",stdin);
    freopen("sub.out","w",stdout);
    scanf("%s",m+1);l1=strlen(m+1);
    scanf("%s",n+1);l2=strlen(n+1);
    pre();
    slove();
    return 0;
}
/*
高精度乘法.
*/
#include<cstring>
#include<cstdio>
#include<iostream>
#define MAXN 10001
using namespace std;
int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3;
char m[MAXN],n[MAXN];
void slove()
{
    int x;
    l3=l1+l2;
    for(int i=1;i<=l1;i++)
    {
        int x=0;
        for(int j=1;j<=l2;j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+l2]=x;
    }
    if(c[l3+1]) l3++;
    while(!c[l3]&&l3>1) l3--;
    for(int i=l3;i>=1;i--) printf("%d",c[i]);
}
int main()
{
    freopen("mul.in","r",stdin);
    freopen("mul.out","w",stdout);
    scanf("%s",m+1);l1=strlen(m+1);
    scanf("%s",n+1);l2=strlen(n+1);
    for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
    for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    slove();
    return 0;
}
/*
高精度除法.
*/
#include<cstring>
#include<cstdio>
#include<iostream>
#define MAXN 10001
using namespace std;
int a[MAXN],b[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3;
char m[MAXN],n[MAXN];
bool cmp()
{
    if(tmp[0]>l1) return false;
    if(l1>tmp[0]) return true;
    for(int i=l1;i>=1;i--)
    {
        if(a[i]>tmp[i]) return true;
        if(a[i]<tmp[i]) return false;
    }
    return true;
}
bool cmp1()
{
    for(int i=1;i<=l1;i++)
    {
        if(m[i]>n[i]) return true;
        if(m[i]<n[i]) return false;
    }
    return true;
}
void slovejian()
{
    for(int i=1;i<=l1;i++)
    {
        if(a[i]<tmp[i]) a[i+1]--,a[i]+=10;
        a[i]-=tmp[i];
    }
    while(!a[l1]&&l1>1) l1--;
}
void slove()
{
    l3=l1-l2+1;
    for(int i=l3;i>=1;i--)
    {
        memset(tmp,0,sizeof tmp);
        for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j];
        tmp[0]=l2+i-1;
        while(cmp()) c[i]++,slovejian();
    }
    while(!c[l3]&&l3>1) l3--;
    for(int i=l3;i>=1;i--) printf("%d",c[i]);
}
int main()
{
    scanf("%s",m+1);l1=strlen(m+1);
    scanf("%s",n+1);l2=strlen(n+1);
    if(l1>l2)
    {
        for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    }
    else if(l1<l2)
    {
        for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
        int t;t=l1,l1=l2,l2=t;
    }
    else if(cmp1())
    {
        for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    }
    else 
    {
        for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48;
        for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48;
        int t;t=l1,l1=l2,l2=t;
    }
    slove();
    return 0;
}
/*
高精度取模求余.
*/
#include<cstring>
#include<cstdio>
#include<iostream>
#define MAXN 10001
using namespace std;
int a[MAXN],b[MAXN],ans[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3;
char m[MAXN],n[MAXN];
bool cmp()
{
    if(tmp[0]>l1) return false;
    if(l1>tmp[0]) return true;
    for(int i=l1;i>=1;i--)
    {
        if(a[i]>tmp[i]) return true;
        if(a[i]<tmp[i]) return false;
    }
    return true;
}
void slovejian()
{
    for(int i=1;i<=l1;i++)
    {
        if(a[i]<tmp[i]) a[i+1]--,a[i]+=10;
        a[i]-=tmp[i];
    }
    while(!a[l1]&&l1>1) l1--;
}
void chu()
{
    l3=l1-l2+1;
    for(int i=l3;i>=1;i--)
    {
        memset(tmp,0,sizeof tmp);
        for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j];
        tmp[0]=l2+i-1;
        while(cmp()) c[i]++,slovejian();
    }
}
void mul()
{
    memset(tmp,0,sizeof tmp);
    tmp[0]=l2+l3;
    for(int i=1;i<=l2;i++)
    {
        int x=0;
        for(int j=1;j<=l3;j++)
        {
            tmp[i+j-1]+=b[i]*c[j];
            x=tmp[i+j-1]/10;
            tmp[i+j]+=tmp[i+j-1]/10;
            tmp[i+j-1]%=10;
        }
        tmp[i+l3]=x;
    }
    if(tmp[tmp[0]+1]) tmp[0]++;
    while(tmp[tmp[0]]&&tmp[0]>1) tmp[0]--;
}
void slove()
{
    chu();mul();
    ans[0]=max(l2,l3);
    for(int i=1;i<=ans[0];i++)
    {
        if(ans[i]<tmp[i]) ans[i+1]--,ans[i]+=10;
        ans[i]-=tmp[i];
    }
    while(!ans[ans[0]]&&ans[0]>1) ans[0]--;
    for(int i=ans[0];i>=1;i--) printf("%d",ans[i]);
}
int main()
{
    scanf("%s",m+1);l1=strlen(m+1);
    scanf("%s",n+1);l2=strlen(n+1);
    for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48,ans[i]=a[i];
    for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48;
    slove();
    return 0;
}
/*
高精度错排公式.
f[n]=(n-1)(f[n-1]+f[n-2]).
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#define MAXN 201
#define MAXM 1001
using namespace std;
int f[MAXN][MAXM],n,tmp[MAXM],t[MAXM];
int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
    return x*f;
}
void slove(int x)
{
    memset(t,0,sizeof t);
    while(x) t[++t[0]]=x%10,x/=10;return ;
}
void add(int c[],int a[],int b[])
{
    c[0]=a[0]+b[0];
    for(int i=1;i<=c[0];i++)
    {
        c[i]+=a[i]+b[i];
        c[i+1]+=c[i]/10;
        c[i]%=10;
    }
    if(c[c[0]+1]) c[0]++;
    while(!c[c[0]]&&c[0]>1) c[0]--;
    return;
}
void mul(int c[],int a[],int b[])
{
    c[0]=a[0]+b[0];
    for(int i=1;i<=a[0];i++)
    {
        int x=0;
        for(int j=1;j<=b[0];j++)
        {
            c[i+j-1]+=a[i]*b[j];
            c[i+j]+=c[i+j-1]/10;
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+b[0]]=x;
    }
    while(!c[c[0]]&&c[0]>1) c[0]--;
    return;
}
int main()
{
    n=read();
    if(n==0){printf("1");return 0;}
    f[1][0]=1,f[1][1]=0;
    f[2][0]=1,f[2][1]=1;
    for(int i=3;i<=n;i++)
    {
        memset(tmp,0,sizeof tmp);
        add(tmp,f[i-1],f[i-2]);
        slove(i-1);
        mul(f[i],t,tmp);
    }
    for(int i=f[n][0];i>=1;i--) printf("%d",f[n][i]);
    return 0;
}
原文地址:https://www.cnblogs.com/nancheng58/p/10068150.html