高精度计算组合数

粘贴一下我修改的内容:

这里的+1的方法值得借鉴

//没有修改的
#include<iostream> int a[100000][1001],m[1001],n[1001],nm[1001],ln=0,lm=0,lnm=0,w,nmm[1001],ans[1001],f=1,k,t; using namespace std; int main() { int nn,mm,i,g=0,j; cin>>mm>>nn; for(i=1;i<=mm;i++) { for(j=1;j<=1000;j++) { a[i][j]=a[i-1][j]*i+g; g=a[i][j]/10; a[i][j]=a[i][j]%10; } } for(i=1;i<=1000;i++) { m[i]=a[mm][i]; if(m[i]>0) lm++; n[i]=a[nn][i]; if(n[i]>0) ln++; nm[i]=a[n-m][i]; if(nm[i]>0) lnm++; } for(i=1;i<=lnm+1;i++) { for(j=1;j<=lm+1;j++) { w=i+j-1; nmm[w]=nm[i]*m[j]+g; g=nmm[w]/10; nmm[w]=nmm[w]%10; } } while(f==1) { for(i=1;i<=ln;i++) { n[i]=n[i]-nmm[i]; if(n[i]<0) { n[i+1]=n[i+1]-1; n[i]=n[i]+10; } } k=1; while(ans[k]==9) k++; ans[k]++; k=1; while(ans[k]==9) { ans[k]=0; k++; } ans[k]++; f=0; for(i=1;i<=ln;i++) if(n[i]>0) f=1; } k=1000; while(ans[k]==0) k--; if(k>5) t=k+1-5; else t=1; for(i=k;i>=t;i--) cout<<ans[i]; cout<<" "<<k; return 0; }

修改之后:

#include<iostream>
int a[100000][1001],m[1001],n[1001],nm[1001],ln=0,lm=0,lnm=0,w,nmm[1001],ans[1001],f=1,k,t;
using namespace std;
int main()
{
    int nn,mm,i,g=0,j;
    cin>>mm>>nn;
    a[0][1]=1;//
    //a[i][]这个数组保存 i 的阶乘 
    for(i=1;i<=mm;i++)
    {
        g=0;//
        for(j=1;j<=1000;j++)
        {
            a[i][j]=a[i-1][j]*i+g;
            g=a[i][j]/10;
            a[i][j]=a[i][j]%10;
        }
    }
    
    /*
    for(int i=1;i<=100;i++)
    {
        for(int j=1;j<=100;j++) cout << a[i][j];
        cout << endl;
    } 
    */
    
    for(i=1;i<=1000;i++)
    {
        m[i]=a[mm][i];
        //if(m[i]>0) lm++;
        if(m[i]>0) lm=i;//
        n[i]=a[nn][i];
        //if(n[i]>0) ln++;
        if(n[i]>0) ln=i;//
        //nm[i]=a[n-m][i];
        nm[i]=a[mm-nn][i];
        //if(nm[i]>0) lnm++;
        if(nm[i]>0) lnm=i;//
    }
    //cout << lm<<" "  <<ln <<" "<< lnm<< " "<<endl; 
    /* 
    for(int i=1;i<=100;i++)
    {
        for(int j=1;j<=100;j++)
        {
            cout << a[i][j];
        }
        cout << endl;
    } 
    */ 
    g = 0;//初始化 
    //m! * (m-n)! 
    /*
    for(i=1;i<=lnm+1;i++)
    {
        for(j=1;j<=lm+1;j++)
        {
            w=i+j-1;
            nmm[w]=nm[i]*m[j]+g;
            g=nmm[w]/10;
            nmm[w]=nmm[w]%10;
        }
    }
    */
    
    //nmm[]=nn!*(nn-mm)!
    for(i=1;i<=lnm+1;i++)
    {
        for(j=1;j<=ln+1;j++)
        {
            w=i+j-1;
            //nmm[w]=nm[i]*m[j]+g;
            nmm[w]=nmm[w]+nm[i]*n[j]+g; 
            g=nmm[w]/10;
            nmm[w]=nmm[w]%10;
        }
    }
    //for(i=1;i<=100;i++) cout << nmm[i];
    //cout << endl;
    
    
    
    /*
    while(f==1)
    {
        for(i=1;i<=ln;i++)
        {
            n[i]=n[i]-nmm[i];
            if(n[i]<0)
            {
                n[i+1]=n[i+1]-1;
                n[i]=n[i]+10;
            }
        }
        k=1;
        while(ans[k]==9) k++;
        ans[k]++;
        f=0;
        for(i=1;i<=ln;i++) if(n[i]>0) f=1;
    }
    */
    
    //mm!/nmm[]
    
    while(f==1)
    {
        //mm-nmm
        for(i=1;i<=lm;i++)
        {
            m[i]=m[i]-nmm[i];
            if(m[i]<0)
            {
                m[i+1]=m[i+1]-1;
                m[i]=m[i]+10;
            }
        }
        //ans[]数组 
        k=1;
        //while(ans[k]==9) k++;
        while(ans[k]==9)
        {
            ans[k]=0;
            k++;    
        } 
        ans[k]++;
        
        f=0;
        for(i=1;i<=lm;i++) if(m[i]>0) f=1;
    }
    
    k=1000;
    
    while(ans[k]==0) k--;
    if(k>5) t=k+1-5; else t=1;
    for(i=k;i>=t;i--) cout<<ans[i];
    cout<<"  "<<k;
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zuimeiyujianni/p/9271812.html