2017-11-18 11 views
0

階乗の後続ゼロを計算しています。私の解決策は、階乗を計算し、それに後続ゼロがどれくらいあるかを決定することです。想像できるように、これはあまりスケーラビリティがありません。どのように私は階乗を計算せずにこれを解決できますか?階数0の階乗、ただし階乗計算なし

私はSOにこれらのページを見つけた: Trailing zeroes in a Factorial Calculating the factorial without trailing zeros efficiently?

は、しかし、どちらもJavaScriptではありません。あなたがこの質問をd​​ownvoteする場合は、なぜ私に教えてください。あなたの時間とフィードバックに感謝します。

私の解決策:数に末尾のゼロの数を知ることが

function zeros(n) { 
    var result = []; 
    var count = 0; 

    for (var i = 1; i <= n; i++) { 
    result.push(i); 
    } //generating range for factorial function 

    var factorial = result.reduce(function(acc, el) { 
    return acc * el; 
    }, 1); //calculating factorial 

    factorial = factorial.toString().split(''); 

    for (var j = factorial.length - 1; j > 0; j--) { 
    if (parseInt(factorial[j]) === 0) { 
     count += 1; 
    } else { 
     break; 
    } 
    } //counting trailing zeros 

    return count; 
} 
+0

確かにそれには、JavaScriptにCコードを変換するために些細です。実際には(https://stackoverflow.com/a/25764907)、最初の 'int'を' function'に変更し、関数内の 'int'の残りの部分を' var'に変更するだけで、 JavaScript。 – JJJ

+0

@JJJ Cについてよく分かりませんが、私はそれらが似ているかどうかはわかりませんでした。ありがとうございました! – Brayheart

答えて

0

それは階乗で両方の5と2

により、10で割った値、すなわち、できる回数を知ることに尽きますカウントするのが非常に簡単な数字:

f! = 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16. ... .f 
      ^  ^   ^

最終的な製品に因子5が入る場所がマークされます。 2の係数がより頻繁に発生することは明らかであるので、5の係数の数は、後続のゼロの数を決定している。

ここで、係数25が発生した場合、それは2でカウントされます。同様に125は、あなたがこのようなループを用いて、そのためにカバーすることができますなど、5の3つの要因を

をカウントする必要があります

function zeros(n) { 
    var result = 0; 
    while (n = Math.floor(n/5)) result += n; 
    return result; 
} 
0
public static void main(String[] args) { 
    int n=23; 
    String fact= factorial(BigInteger.valueOf(23)).toString(); 
    System.out.format("Factorial value of %d is %s\n", n,fact); 
    int len=fact.length(); 
    //Check end with zeros 
    if(fact.matches(".*0*$")){ 
     String[] su=fact.split("0*$"); 
     //Split the pattern from whole string 
     System.out.println(Arrays.toString(fact.split("0*$"))); 
     //Subtract from the total length 
     System.out.println("Count of trailing zeros "+(len-su[0].length())); 
     } 

    } 

    public static BigInteger factorial(BigInteger n) { 
    if (n.equals(BigInteger.ONE) || n.equals(BigInteger.ZERO)) { 
     return BigInteger.ONE; 
    } 
    return n.multiply(factorial(n.subtract(BigInteger.ONE))); 


    } 
0

あなたは本当にカウントする階乗積を計算する必要はありません。末尾のゼロ。

ここでは、nの末尾のゼロの数を数えます。

temp = 5; 
    zeroes = 0; 
    //counting the sum of multiples of 5,5^2,5^3....present in n! 
    while(n>=temp){ 
     fives = n/temp; 
     zeroes = zeroes + fives; 
     temp = temp*5; 
    } 
    printf("%d",zeroes); 

階乗積の5の各倍数は、後続ゼロの数に1を与えることに注意してください。これに加えて、25の各倍数は、末尾の0の数に1を追加します。次に、125の各倍数は、後続のゼロの数に1をもうけます。ここで

がこの背景にある概念を理解するのに最適のリンクです:https://brilliant.org/wiki/trailing-number-of-zeros/

関連する問題