Vypočítajte faktoriál v prostredí Java

1. Prehľad

Dané nezáporné celé číslo n, faktoriál je produktom všetkých kladných celých čísel menších alebo rovných n.

V tomto rýchlom výučbe to preskúmame rôznymi spôsobmi výpočtu faktoriálu pre dané číslo v prostredí Java.

2. Faktoriál pre čísla do 20

2.1. Faktoriál pomocou a pre Slučka

Pozrime sa na základný faktoriálny algoritmus využívajúci a pre slučka:

public long factororialUsingForLoop (int n) {long fact = 1; pre (int i = 2; i <= n; i ++) {fact = fact * i; } vrátiť skutočnosť; }

Vyššie uvedené riešenie bude fungovať pokuta za čísla do 20. Ale ak skúsime niečo väčšie ako 20, potom to zlyhá, pretože výsledky by boli príliš veľké na to, aby sa zmestili do a dlho, spôsobujúci pretečenie.

Poďme sa pozrieť na zopár ďalších, pričom upozorňujeme, že každý z nich tieto budú fungovať iba pre malý počet.

2.2. Faktoriál Používanie streamov Java 8

Môžeme tiež použiť Java 8 Prúd API na pomerne jednoduchý výpočet faktoriálov:

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

V tomto programe najskôr použijeme LongStream iterovať číslami od 1 do n. Potom sme použili znížiť (), ktorá pre redukčný krok používa hodnotu identity a funkciu akumulátora.

2.3. Faktoriál pomocou rekurzie

A pozrime sa na ďalší príklad faktoriálneho programu, ktorý tentokrát využíva rekurziu:

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

2.4. Faktoriál pomocou Apache Commons Math

Apache Commons Math má CombinatoricsUtils triedy so statickým faktoriál metóda, ktorú môžeme použiť na výpočet faktoriálu.

Ak chcete zahrnúť Apache Commons Math, pridáme commons-math3 závislosť do našej pom:

 org.apache.commons commons-math3 3.6.1 

Pozrime sa na príklad použitia CombinatoricsUtils trieda:

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

Všimnite si, že jeho návratový typ je dlho, rovnako ako naše domáce riešenia.

To tu znamená, že ak vypočítaná hodnota presiahne Long.MAX_VALUE, a MathArithmeticException je hodená.

Ak sa chcete zväčšiť, budeme potrebovať iný návratový typ.

3. Faktoriál pre čísla väčšie ako 20

3.1. Faktoriálne použitie BigInteger

Ako už bolo uvedené, dlho dátový typ je možné použiť pre faktoriály iba pre server n <= 20.

Pre väčšie hodnoty n, môžeme použiť BigInteger trieda z java.math balíček, ktorý pojme hodnoty do 2 ^ Celé číslo.MAX_VALUE:

public BigInteger factororialHavingLargeResult (int n) {BigInteger result = BigInteger.ONE; pre (int i = 2; i <= n; i ++) result = result.multiply (BigInteger.valueOf (i)); návratový výsledok; }

3.2. Faktoriál pomocou Guavy

Knižnica Guava spoločnosti Google poskytuje aj užitočnú metódu na výpočet faktoriálov pre väčšie počty.

Ak chcete zahrnúť knižnicu, môžeme pridať jej guava závislosť na našom pom:

 com.google.guava guava 25,1-jre 

Teraz môžeme použiť statiku faktoriál metóda z BigIntegerMath triedy na výpočet faktoriálu daného čísla:

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

4. Záver

V tomto článku sme videli niekoľko spôsobov výpočtu faktoriálov pomocou jadra Java, ako aj niekoľkých externých knižníc.

Prvýkrát sme videli riešenia pomocou dlho dátový typ na výpočet faktoriálov s číslami do 20. Potom sme videli niekoľko spôsobov použitia BigInteger pre čísla väčšie ako 20.

Kód uvedený v tomto článku je k dispozícii na stránkach Github.


$config[zx-auto] not found$config[zx-overlay] not found