我正試圖計算階乘的最低有效非零數。階乘的最低有效非零數
我有下面的代碼片斷:
$(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最壞可能的情況下,階乘是十億(當實際計算和讀取階乘不可行或不可取時)。
什麼是忽視倍數的原因5?是否有數學原因爲什麼5的倍數表現奇怪? – Marc
這裏有一個小提琴,它可以讓很多人看起來很正確,但是有一些數字會被扔掉;即15,24和35(我測試1到40)。也許你理解爲什麼這些數字很麻煩的數學:https://jsfiddle.net/cwsoejLr/在那裏我顯然在嘗試對某些數字進行醜陋的黑客攻擊。 – Marc
@Marc我忽略了5的倍數的原因是它們是導致階乘爲零的那些,但因爲我只想要非零有效數字,我可以忽略5的倍數以減少所需的計算問題。 – stark