您的位置:程序门 -> web 开发 -> javascript



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


谁帮解释这个阶乘速算法的原理?[已结贴,结贴人:cuixiping]
发表于:2007-07-04 17:29:00 楼主

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

一种写法:

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));
        }
}


另一种写法:

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( " ");
}


发表于:2007-07-04 17:51:241楼 得分:0
data里面确实有正确值
其它都是空
阶乘多容易   干嘛用这个
发表于:2007-07-04 19:29:032楼 得分:40
jk   2002-02-22的代码。
http://topic.csdn.net/t/20011022/19/334766.html

jk用的是递归,multin用的是循环。(循环的效率应该会好点)
进制是一样的(都是用10000000000进制)(能达到精度的前提下,进制越大,速度越快)


<html>

<head>
<meta   http-equiv= "content-type "   content= "text/html;   charset=gb2312 ">
<meta   name= "generator "   content= "microsoft   frontpage   4.0 ">
<meta   name= "progid "   content= "frontpage.editor.document ">
<title> 计算的阶乘 </title>
</head>

<body>   计算 <input   name= "themaxinput "   maxlength=4> 的阶乘, <input   value=开始   type=submit   onclick= "javascript:nowstart(themaxinput.value*1+1) ">

<br> <font   color=red   size=-1> 注:将鼠标移到这里,按右键,点击查看源文件,可以看到详细程式 </font>
</body>

</html>
<script   language=javascript>
var   a=new   array(1,0); //结果
var   i; //循环1-1000


function   nowstart(themax)
{document.write   ( " <br> 计算 "+(themax-1)+ "的阶乘 ");
document.write   ( " <br> 开始时间: "+date()+ " <br> 结果: <br> ");
for   (i=1;i <themax;i++)   achengi(a,i);
document.write   ( " <br> 结束时间: "+date());
document.write   ( " <br> 总长度为: "+a.reverse().join( ", "));

}
function   achengi(aa,ii) //实现递推相乘的步伐
{
var   c=0;
var   d=0;
for   (var   l=0;(l <a.length) ¦ ¦(c> 0);l++)  
{
if   (l> =a.length)   a[l]=0;
d=c+a[l]*i;
a[l]=d%10000000000;
c=(d-a[l])/10000000000;
}
}

</script>
发表于:2007-07-04 19:30:323楼 得分:0
sorry,
jk用的也是循环,而不是递归,


快速检索

最新资讯
热门点击