zoukankan      html  css  js  c++  java
  • 高精度计算组合数

    粘贴一下我修改的内容:

    这里的+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;
    }
  • 相关阅读:
    Zookeeper----1.基础知识
    UML图
    VUE入门3---axios
    VUE入门2---vue指令
    谁先执行?props还是data或是其他? vue组件初始化的执行顺序详解
    vue双向绑定原理分析
    HTML/CSS -- 浏览器渲染机制
    vue工作原理分析
    导入导出需求整理
    .NET 异步详解
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/9271812.html
Copyright © 2011-2022 走看看