YCOE

You Can't stOp mE!

导航

阶乘几种算法的比较

Posted on 2006-04-15 15:22  YCOE  阅读(539)  评论(0编辑  收藏  举报
计算1!+2!+3!+...+n!的问题会有好几中算法,但不同的算法速度会有天壤之别,特别是在n越大的时候.心血来潮,用HTML和JavaScript做了个演示几种算法的网页.

<script language = javascript>
//第一种算法
function jc(){
    i 
= parseInt(document.j.c.value);
    
var date = new Date();
    sum 
= 0;
    test 
= "0!";
    
for(a=1;a<=i;++a){
        result 
= 1;
        
for(n = 2;n<=a;++n){
            result
*=n;
        }

    sum 
+=result;
    test 
= test +"+"+a+ "!";
    }

    
var date1 = new Date();
    alert(i
==0?"1":sum + "\n用时:"+(date1-date));
}





//======================第二种算法
function jc1(){
    i 
= parseInt(document.j.c.value);
    
var date22 = new Date();
    test 
= "";
    sum 
= 0;
    
for(n = 1; n<=i;++n){
        sum
+=c(n);
        test 
+=n+"!="+c(n)+"\n";
    }

    
var date2 = new Date();
    alert(sum 
+ "\n用时:"+(date2-date22));
}


function c(n){
    
return n==0?1:n*c(n-1);
}




//===========第三种算法

function jc2(){
    i 
= parseInt(document.j.c.value);
    
var date33 = new Date();
    pre 
= 1;
    test 
= "";
    count 
= "0!";
    sum 
= 0;
    
for(n = 1; n<=i;++n){
        sum 
+= c2(n);
        count 
+="+" +n+"!";
    }

    
var date3 = new Date();
    alert(i
==0?"1":sum + "\n用时:"+(date3-date33));
}


function c2(n){
    pre 
*= n;
    test 
+=n+"!="+pre+"\n";
    
return pre;
}

</script>
<body>
算法:1! + 2! +  + n!
<br/>
<form name="j" id="j">
    
<input type="text" name = "c" value=10>
    
<input type = "button" value="算法1" onClick="jc()"/>
    
<input type = "button" value="算法2" onClick="jc1()"/>
    
<input type = "button" value="算法3" onClick="jc2()"/>
</form>
</body>

  在测试的时候,算法2明显比算法1和算法3慢得多,因此在计算的时候,不要把n的值设得太高,用算法2的时候设为100都很慢了.超过170时会因为结果过大而显示不了正确的值,但值并不影响算法的执行.
  相对于算法3来说,速度非常的快,可以把n的值设到10000都只用了几秒钟而已.但对其它算法,不要玩火,一不小心会死机的!
               --原创文章,可以随意复制发表,请注明出处和作者
                               BY YCOE