2016-02-02 42 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