Utilização de BigInteger e fatoração

Propaganda
Big Integer
Introdução

Por que usar?

Computar o valor de 25!

28! é divisível por 8736?

Trabalhar com string.

Não tem limite.
Introdução

Classe do Java.

A classe suporta as seguintes operações:

Adição (add);


Subtração (subtract);


su = s.subtract(b);
Multiplicação (multiply);


s = s.add(b); // b também é um BigInteger
su = s.multiply(b);
Divisão (divide);

s = s.divide(b);
Introdução

Mais operações

Resto (remainder);


Modulo (mod);


s= s.mod(b);
Divisão e resto (divideAndRemainder);


s = s.remainder(b);
s = s.divideAndRemainder(b); // retorna uma array, o primeiro contém s / b e
o outro s % b
Potência (power).

s = s.pow(b); // b aqui tem que ser inteiro
Como usar

UVA 424 - Integer Inquiry
import java.math.BigInteger;
import java.util.Scanner;
class Main {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
BigInteger zero = BigInteger.ZERO;
BigInteger sum = BigInteger.ZERO;
for(;;) {
BigInteger b = s.nextBigInteger();
if(b.equals(zero)) break;
sum = sum.add(b);
}
System.out.println(sum.toString());
}
}
Como usar
UVA 1226 - Numerical surprises

import java.util.Scanner;
import java.math.BigInteger;
class Main {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
int t = s.nextInt();
BigInteger r = BigInteger.ZERO;
BigInteger p = BigInteger.ZERO;
BigInteger n = BigInteger.ZERO;
for(int i = 0; i < t; ++i){
n = s.nextBigInteger();
p = s.nextBigInteger();
r = p.remainder(n);
System.out.println(r.toString());
}
}
}
Fatoração
Introdução

Um número – não primo – pode ser escrito como uma multiplicação
dos seus fatores primos.

Algoritmo usando DP;

O( √ N /ln√ N)
Como usar

UVA 583 - Prime Factors
vector<int> primeFactors(long long int N) {
vector<int> factors;
long long PF_idx = 0, PF = primes[PF_idx];
while (N != 1 && (PF * PF <= N)) {
while (N % PF == 0) {
N /= PF; factors.push_back(PF);
}
PF = primes[++PF_idx];
}
if (N != 1) factors.push_back(N);
return factors;
}
int main() {
int n;
sieve(50000);
while(scanf("%d", &n) && n){
vector<int> factors = primeFactors(fabs(n));
printf(n < 0? "%d = -1 x %d" : "%d = %d", n, factors[0]);
for(int i = 1; i < factors.size(); i++)
printf(" x %d", factors[i]);
printf("\n");
}
}
Download