2016-03-28 6 views
-3
import java.util.Scanner; 
import java.io.*; 
class factorial { 

    void fact(int a) { 
     int i; 
     int ar[] = new int[10000]; 
     int fact = 1, count = 0; 
     for (i = 1; i <= a; i++) { 

      fact = fact * i; 
     } 
     String str1 = Integer.toString(fact); 
     int len = str1.length(); 
     i = 0; 
     do { 
      ar[i] = fact % 10; 
      fact /= 10; 
      i++; 
     } while (fact != 0); 
     for (i = 0; i < len; i++) { 
      if (ar[i] == 0) { 
       count = count + 1; 
      } 
     } 
     System.out.println(count); 
    } 
    public static void main(String...ab) { 
     int a; 
     Scanner input = new Scanner(System.in); 
     a = input.nextInt(); 
     factorial ob = new factorial(); 
     ob.fact(a); 
    } 
} 

Dieser Code ist arbeiten bis zu a = 10 aber nach Eingabe Nummer größer dann a = 16 es gibt falsche Antwort Hinter. Bitte helfen. Da ich diese Frage nicht posten kann, wenn ich nicht mehr Informationen für diese Frage hinzufüge, aber ich nehme an, dass die Info, die ich oben zur Verfügung stelle, genug ist, um zu verstehen, was ich will.Anzahl Nullen in faktorielles in java

+6

Hinreichend große factorials mit überlaufen 'int', dann wird es' long' überlaufen. Sie können 'BigInteger' verwenden, müssen es aber nicht. Verfolgen Sie, wie viele Faktoren von 2 und 5 im Produkt enthalten sind. Dadurch wird die Anzahl der abschließenden Nullen angezeigt. – rgettman

+0

Ohk Danke für den Tipp. –

+0

Da Sie die min (# 2, # 5) benötigen, und es gibt viel mehr Faktoren von zwei in dem Produkt, müssen Sie wirklich nur die Anzahl der Faktoren von 5 zu verfolgen. – AJNeufeld

Antwort

0

Bitte beachten Sie, dies ist nicht die mathematische Lösung ist als andere vorgeschlagen, das nur ein Refactoring ist, was er ursprünglich hatte ...

Here I BigInteger anstelle von Int, und vereinfacht den Code abit nur verwendet. Ihre Lösung ist immer noch nicht optimal. Ich dachte, ich würde dir nur zeigen, wie eine umgestaltete Version von dem aussieht, was du gepostet hast. Auch gab es einen Fehler in Ihrer ursprünglichen Funktion. Es gab die Anzahl der Nullen in der ganzen Zahl statt nur die Anzahl der abschließenden Nullen zurück.

import java.math.BigInteger; 
import java.util.Scanner; 

class factorial { 

    public static void main(String... ab) { 
     Scanner input = new Scanner(System.in); 
     int a = input.nextInt(); 
     fact(a); 
    } 

    private static void fact(int a) { 
     BigInteger fact = BigInteger.ONE; 
     int i, count = 0; 
     for (i = 1; i <= a; i++) { 
      fact = fact.multiply(new BigInteger(Integer.toString(i))); 
     } 
     String str1 = fact.toString(); 
     for(int j = str1.length() - 1; j > -1; j--) { 
      if(Character.digit(str1.charAt(j), 10) != 0) { 
       System.out.println(count); 
       break; 
      } else { 
       count++; 
      } 
     } 
    } 
} 
2

Wie viele dieser mathematischen Rätsel wird von Ihnen erwartet, dass Sie das Problem vereinfachen, um es praktisch zu machen. Sie müssen herausfinden, wie viele Zehnerpotenzen in einer Fakultät enthalten sind, nicht eine Fakultät berechnen und dann die Anzahl der nachgestellten Nullen finden.

Die einfachste Lösung ist es, die Anzahl der Potenzen von fünf zu zählen. Der Grund, warum Sie nur Potenzen von fünf zählen müssen, ist, dass es dazwischen viele Zahlen gibt, um eine 10 zu bilden. Zum Beispiel 5! hat eine 0, 10! hat 2, 15! hat drei, 20! hat vier und 25! hat nicht fünf, sondern sechs als 25 = 5 * 5.

Kurz gesagt müssen Sie nur die Anzahl der Kräfte von fünf zwischen 1 und N.

// floor(N/5) + floor(N/25) + floor(N/125) + floor(N/625) ... 
public static long powersOfTenForFactorial(long n) { 
    long sum = 0; 
    while (n >= 5) { 
     n /= 5; 
     sum += n; 
    } 
    return sum; 
} 

Hinweis berechnen: Dabei werden die nachfolgenden Nullen von Long berechnen .MAX_WERT! in einer Fraktion von einer Sekunde, während dies mit BigInteger versuchen würde nicht passen, egal wie viel Speicher Sie hatten.

0

Ohne faktorielles

public class TrailingZero { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    System.out.println(trailingZeroes(9247)); 

} 

public static int trailingZeroes(int a) { 
    int count = 0; 
    int countTwo = 0; 
    int countFive = 0; 

    for (int i = a; i > 1; i--) { 
     int localTwo = 0; 
     int local = i; 
     while (local > 1) { 
      if (local % 2 != 0) { 
       break; 
      } 

      local = local/2; 
      localTwo++; 

     } 

     countTwo += localTwo; 
     int localFive = 0; 
     while (local > 1) { 
      if (local % 5 != 0) { 
       break; 
      } else { 
       local = local/5; 
       localFive++; 
      } 

     } 

     countFive += localFive; 

    } 

    if (countTwo == countFive) { 
     count = count + countFive; 
    } else if (countTwo > countFive) { 
     count = count + countFive; 
    } else if (countFive > countTwo) { 
     count = count + countTwo; 
    } 

    return count; 
}} 
Verwandte Themen