我正试图计算阶乘的最低有效非零数。阶乘的最低有效非零数
我有下面的代码片断:
$(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