Para um fatorial n! é preciso
- Calcular, para cada primo p menor que n, a soma (s) das divisões de n pelas potências (q) de p menores que n;
- n! é a multiplicação de todos os ps.
Então, para 10!, teremos:
Se eu já tivesse uma lista de primos guardada, o código seria ainda mais simples.
- 2^(10/2 + 10/4 + 10/8) = 2^(5+2+1)=2^8
- 3^(10/3 + 10/9) = 3^(3+1) = 3^4
- 5^(10/5) = 5^2
- 7^(10/7) = 7^1
Logo, n! = 2^8*3^4*5^2*7 = 3628800.
import java.math.BigInteger;
public class Factorial {
public static BigInteger f(int n) {
int m=n+1;
int[] s=new int[m];
for(int i=2; i<=m/2; i++) {
if(s[i]!=-1) {
//Marcar todos os múltiplos
for(int p=i+i; p<m; p+=i) {
s[p]=-1;
}
//Calcular soma de expoentes até a maior potência anterior a n
for(int q=i; q<=n; q=q*i) {
s[i]+=n/q;
}
}
}
BigInteger f=BigInteger.ONE;
for(int k=2; k<m; k++) {
int pk=s[k];
if(pk>=0) {
if(k>2) {
System.out.print("*");
}
if(pk<2) {
System.out.print(k);
f=f.multiply(BigInteger.valueOf(k));
} else {
System.out.print(k+"^"+pk);
f=f.multiply(BigInteger.valueOf(k).pow(pk));
}
}
}
return f;
}
public static void main(String... args) {
for(int i=2; i<20; i++) {
System.out.printf("%d! = ", i);
BigInteger f1=f(i);
System.out.printf(" = %d\n", f1);
}
}
}
Nenhum comentário:
Postar um comentário