首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

哪位高手帮解释这个阶乘速算法的原理

2012-02-09 
谁帮解释这个阶乘速算法的原理?谁帮解释这个阶乘速算法的原理?一种Javascript写法:functionjc(N){vardata

谁帮解释这个阶乘速算法的原理?
谁帮解释这个阶乘速算法的原理?

一种Javascript写法:

function   jc(N)   {
        var   data   =   new   Array(100);
        var   num   =   0;         //   占用的个数
        data[0]   =   1;         //   0和1的阶乘是1
        for(var   i=1;i <data.length;i++){
                data[i]=0;
        }
       
        for   (var   i   =   2;   i   <=   N;   i++)   {
                for   (var   j   =   0;   j   <   num   +   1;   j++)   {
                        data[j]   *=   i;                 //   对每个int中的数都乘上   i
                }
                for   (var   j   =   0;   j   <   num   +   1;   j++)   {
                        if   (data[j]   >   1000000)   {
                                for   (var   k   =   j;   k   <   num   +   1;   k++)   {
                                        if   (data[num]   >   1000000)   num++;
                                        data[k+1]   +=   Math.floor(data[k]/1000000);         //   进位
                                        data[k]   %=   1000000;                                     //   进位后的余数
                                }
                        }
                }
        }
        T1.value=( "计算 "   +   N   +   "的阶乘\n ");
        T1.value+=( "占用的int数: "   +   (num+1)   +   "\n值:\n ");
        T1.value+=(data[num]);
        for   (var   i   =   num-1;   i   >   -1;   i--)   {
                T1.value+=((1000000+data[i]).toString().substr(1));
        }
}


另一种Javascript写法:

function   multiN(n)   //连乘n!
{
        var   r   =   [1];
        for(var   i   =   2;   i   <=   n;   i++)
        {


                for(var   j   =   0,   c   =   0;   j   <   r.length   ||   c   !=   0;   j++)
                {
                        var   v     =   j   <   r.length   ?   r[j]   *   i   +   c   :   c;
                        r[j]   =   v   %   10000000000;
                        c             =   (v   -   r[j])   /   10000000000;
                }  
        }
       
        for(var   i   =   0;   i   <   r.length   -   1;   i++)
        {
                if(r[i]   <   10)     {r[i]   =   '000000000 '   +   r[i];   continue;}
                if(r[i]   <   100)     {r[i]   =   '00000000 '   +   r[i];   continue;}
                if(r[i]   <   1000)     {r[i]   =   '0000000 '   +   r[i];   continue;}
                if(r[i]   <   10000)     {r[i]   =   '000000 '   +   r[i];   continue;}
                if(r[i]   <   100000)     {r[i]   =   '00000 '   +   r[i];   continue;}
                if(r[i]   <   1000000)     {r[i]   =   '0000 '   +   r[i];   continue;}
                if(r[i]   <   10000000)     {r[i]   =   '000 '   +   r[i];   continue;}
                if(r[i]   <   100000000)     {r[i]   =   '00 '   +   r[i];   continue;}
                if(r[i]   <   1000000000)     {r[i]   =   '0 '   +   r[i];   continue;}
        }
        //document.writeln(r.length+ ': ');
        //document.writeln(r.join( ', '));
        return   r.reverse().join( " ");
}


另一种Java写法:
       
        public   static   void   main(String[]   args)   {
                int[]   data   =   new   int[100];
                int   num   =   0;         //   占用的个数
                data[0]   =   1;         //   0和1的阶乘是1
               
                for   (int   i   =   2;   i   <   257;   i++)   {


                        for   (int   j   =   0;   j   <   num   +   1;   j++)   {
                                data[j]   *=   i;                 //   对每个int中的数都乘上   i
                        }
                        for   (int   j   =   0;   j   <   num   +   1;   j++)   {
                                if   (data[j]   >   1000000)   {
                                        for   (int   k   =   j;   k   <   num   +   1;   k++)   {
                                                if   (data[num]   >   1000000)   num++;
                                                data[k+1]   +=   data[k]/1000000;         //   进位
                                                data[k]   %=   1000000;                   //   进位后的余数
                                        }
                                }
                        }
                }
                System.out.println( "占用的int数: "   +   (num+1)   +   "\n值: ");
                System.out.print(data[num]);
                for   (int   i   =   num-1;   i   >   -1;   i--)   {
                        System.out.print(new   java.text.DecimalFormat( "000000 ").format(data[i]));
                }
        }



[解决办法]
像这样类似的代码很多,代码虽不同,算法还是相通的。可看看我的blog,内有大数阶乘的算法和代码。

[解决办法]
话说这几个都很低效,怎么就是速算法了呢?
大整数用一个数组表示。
第一个和第三个就是模拟竖式乘法,第二个似异实同,没什么特别的算法。

热点排行