• 高精度相关模板


    /*
    高精度加法.
    */
    #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;
    }
  • 相关阅读:
    [四、Xcode界面]11Xcode右侧界面介绍
    [四、Xcode界面]14快速查找并打开文件
    [四、Xcode界面]21几种在控制台输出日志的方式
    [四、Xcode界面]15快速更改同名变量
    [四、Xcode界面]13Xcode声音效果的设置
    [四、Xcode界面]18代码编写的自动补全功能
    [四、Xcode界面]10Xcode左侧界面介绍二
    [四、Xcode界面]12Xcode代码区的样式设置
    C++ in Node.js 业务场景及开发实现
    如何更好的统一颜色规范?这个方法正在成为新趋势
  • 原文地址:https://www.cnblogs.com/nancheng58/p/10068150.html
Copyright © 2020-2023  润新知