2016-02-02 51 views
3

我正試圖計算階乘的最低有效非零數。階乘的最低有效非零數


我有下面的代碼片斷:

$(document).ready(function() { 
 
    $('#submit').click(function() { 
 
    var n = $('#number').val(); 
 
    get_result(n); 
 
    }); 
 
}); 
 

 
function get_result(n) { 
 
    var factorial = 1; 
 
    var factorial2 = 1; 
 
    for (i = 1; i <= n; i++) { 
 
    factorial = factorial * i; 
 
    } 
 
    var count_5 = 0; 
 
    for (j = 1; j <= n; j++) { 
 
    if (j % 5 != 0) { 
 
     factorial2 = factorial2 * (j % 10); 
 
     factorial2 = factorial2 % 10; 
 
    } else if (j % 5 == 0) { 
 
     count_5 = 1; 
 
    } 
 
    } 
 
    if (count_5 == 1) { 
 
    factorial2 = factorial2 * 5; 
 
    } 
 
    console.log(factorial2); 
 
    factorial2 = factorial2.toString(); 
 
    var digit = 0; 
 
    for (i = 0; i < factorial2.length; i++) { 
 
    if (factorial2[i] != '0') { 
 
     digit = factorial2[i]; 
 
    } 
 
    } 
 
    $('#display').text("Factorial of " + n + " is " + factorial); 
 
    $('#display2').text("Least significant digit of Factorial of " + n + " is " + digit); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="display"> 
 

 
</div> 
 
<div id="display2"> 
 

 
</div> 
 
<input type="text" value="" id="number"> 
 
<input type="submit" id="submit">

作爲上述代碼的一部分,來計算所述至少顯著非零數字,我首先忽略所有5的倍數,其次,在階乘計算的每一步中,我從10中取出階乘2的剩餘部分,以便僅在計算的每一步中保留非零數字最終,我將factorial2的最終值乘以5,然後將其轉換爲字符串,並查找字符串中最後一次出現的非零數字。

以上代碼對於n = 1,2 ........,8的值似乎工作正常。但在n = 9時,代碼將最不重要的非零數字返回爲3,而它應該返回8.

例如:因子(9)= 362880,因此最低有效非零數字= 8 。

錯誤是什麼,我該如何糾正它?還有另一個更好的執行方法來計算這個結果嗎?

注:我已經包括了代碼來計算階乘只爲驗證的目的,我的最終目的是隻計算至少顯著非零數字,而不是當n最壞可能的情況下,階乘是十億(當實際計算和讀取階乘不可行或不可取時)。

+0

什麼是忽視倍數的原因5?是否有數學原因爲什麼5的倍數表現奇怪? – Marc

+0

這裏有一個小提琴,它可以讓很多人看起來很正確,但是有一些數字會被扔掉;即15,24和35(我測試1到40)。也許你理解爲什麼這些數字很麻煩的數學:https://jsfiddle.net/cwsoejLr/在那裏我顯然在嘗試對某些數字進行醜陋的黑客攻擊。 – Marc

+0

@Marc我忽略了5的倍數的原因是它們是導致階乘爲零的那些,但因爲我只想要非零有效數字,我可以忽略5的倍數以減少所需的計算問題。 – stark

回答

1

問題是5不會消失。它們與2結合創建一個0.因此,在5的倍數(如15或35)或2的許多冪數(如24)之後會出現問題。最好的辦法可能是保持2的數量的計數,並減少5的倍數(總是有更多的2比5的倍數)。 (另外,一旦你去尋找數字,沒有0的麻煩,你並不需要將其轉換爲字符串。)

$(document).ready(function() { 
 
    $('#submit').click(function() { 
 
    var n = $('#number').val(); 
 
    get_result(n); 
 
    }); 
 
}); 
 

 
function get_result(n) { 
 
    var factorial = 1; 
 
    var factorial2 = 1; 
 
    for (var i = 1; i <= n; i++) { 
 
    factorial = factorial * i; 
 
    } 
 
    var extra2s = 0; 
 
    for (var j = 1; j <= n; j++) { 
 
    var jcopy = j; 
 
    while(jcopy%10 == 0) { 
 
     jcopy /= 10; 
 
    } 
 
    while(jcopy%2==0) { 
 
     extra2s++; 
 
     jcopy /= 2; 
 
    } 
 
    while(jcopy%5==0) { 
 
     extra2s--; 
 
     jcopy /= 5; 
 
    } 
 
    jcopy %= 10; 
 
    factorial2 = (factorial2 * jcopy)%10; 
 
    } 
 
    for (var k = 0 ; k < extra2s ; k++) { 
 
    factorial2 = (factorial2 * 2)%10; 
 
    } 
 
    var digit = factorial2; 
 
    $('#display').text("Factorial of " + n + " is " + factorial); 
 
    $('#display2').text("Least significant digit of Factorial of " + n + " is " + digit); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="display"> 
 

 
</div> 
 
<div id="display2"> 
 

 
</div> 
 
<input type="text" value="" id="number"> 
 
<input type="submit" id="submit">

+0

謝謝,這完美的作品。 – stark