Beräkna faktor i Java

1. Översikt

Med tanke på ett icke-negativt heltal n , är faktoriell produkt av alla positiva heltal som är mindre än eller lika med n .

I den här snabbhandledningen kommer vi att utforska olika sätt att beräkna faktoria för ett visst nummer i Java .

2. Faktor för nummer upp till 20

2.1. Faktor med en för slinga

Låt oss se en grundläggande faktoralgoritm som använder en for- loop:

public long factorialUsingForLoop(int n) { long fact = 1; for (int i = 2; i <= n; i++) { fact = fact * i; } return fact; }

Ovanstående lösning fungerar bra för siffror upp till 20 . Men om vi försöker med något större än 20 kommer det att misslyckas eftersom resultaten skulle vara för stora för att passa in i en lång , vilket orsakar ett överflöd.

Låt oss se några fler och notera att var och en av dessa bara fungerar för små antal.

2.2. Faktor med Java 8-strömmar

Vi kan också använda Java 8 Stream API för att beräkna faktablad ganska enkelt:

public long factorialUsingStreams(int n) { return LongStream.rangeClosed(1, n) .reduce(1, (long x, long y) -> x * y); }

I det här programmet använder vi först LongStream för att upprepa siffrorna mellan 1 och n . Vi använde sedan reducera () , som använder ett identitetsvärde och en ackumulatorfunktion för reduktionssteget.

2.3. Faktor med användning av rekursion

Och låt oss se ett annat exempel på ett faktorprogram, den här gången med rekursion:

public long factorialUsingRecursion(int n) { if (n <= 2) { return n; } return n * factorialUsingRecursion(n - 1); }

2.4. Faktor med Apache Commons Math

Apache Commons Math har en CombinatoricsUtils- klass med en statisk faktoriell metod som vi kan använda för att beräkna faktoria.

För att inkludera Apache Commons Math lägger vi till commons-math3- beroendet i vår pom :

 org.apache.commons commons-math3 3.6.1 

Låt oss se ett exempel med hjälp av klassen CombinatoricsUtils :

public long factorialUsingApacheCommons(int n) { return CombinatoricsUtils.factorial(n); }

Observera att dess returtyp är lång , precis som våra hemodlade lösningar.

Det betyder här att om det beräknade värdet överstiger Long.MAX_VALUE kastas ett MathArithmeticException .

För att bli större behöver vi en annan returtyp.

3. Faktor för siffror som är större än 20

3.1. Faktor med BigInteger

Som tidigare diskuterats kan den långa datatypen endast användas för faktoria för n <= 20 .

För större värden på n kan vi använda BigInteger- klassen från paketet java.math , som kan innehålla värden upp till 2 ^ Integer.MAX_VALUE :

public BigInteger factorialHavingLargeResult(int n) { BigInteger result = BigInteger.ONE; for (int i = 2; i <= n; i++) result = result.multiply(BigInteger.valueOf(i)); return result; }

3.2. Faktor med Guava

Googles Guava-bibliotek tillhandahåller också en verktygsmetod för att beräkna faktablad för större antal.

För att inkludera biblioteket kan vi lägga till dess guava- beroende i vår pom :

 com.google.guava guava 25.1-jre 

Nu kan vi använda den statiska fakultetmetoden från BigIntegerMath- klassen för att beräkna faktorn för ett givet nummer:

public BigInteger factorialUsingGuava(int n) { return BigIntegerMath.factorial(n); }

4. Slutsats

I den här artikeln såg vi några sätt att beräkna faktablad med hjälp av Java-kärnan samt ett par externa bibliotek.

Vi såg först lösningar som använde den långa datatypen för att beräkna faktablad för siffror upp till 20 . Sedan såg vi ett par sätt att använda BigInteger för nummer större än 20.

Koden som presenteras i den här artikeln finns tillgänglig på Github.