Somar números gigantes..  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Dryca
What is classpath?
[Avatar]

Membro desde: 09/03/2010 10:10:00
Mensagens: 7
Offline

Galera...
Alguem sabe como faço para somar numeros inteiros gigantes?
Acho que preciso implementar uma classe atraves de arrays pq quero somar qualquer tamanho de numeros bem maior que 32 bits...
me parece que tem uma classe feita em uma biblioteca que já faz isso...

alguém sabe qual é?
tem alguma implementada que me sirva de exemplo?

valew
neeryck
Java Ninja
[Avatar]

Membro desde: 10/07/2009 11:34:12
Mensagens: 274
Offline

http://java.sun.com/javase/6/docs/api/java/math/BigInteger.html

"É impossível para um homem aprender aquilo que ele acha que já sabe"(Epítero).
davidbuzatto
Moderador
[Avatar]

Membro desde: 07/08/2004 23:47:57
Mensagens: 3927
Localização: Vargem Grande do Sul - SP
Offline

Oi Dryca,

Para trabalhar com números de precisão arbitrária, tanto inteiros como em ponto flutuante, você pode usar respectivamente as classes java.math.BigInteger e java.math.BigDecimal.

[]´s

Seja educado. Agradeça quem te ajudou. Não custa nada.
Dúvidas de Java? Utilize o fórum! Não respondo via MP.

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand." (Fowler)
"A vida é um escândalo, e no final dá sempre errado. O que humaniza o homem é o fracasso."

http://davidbuzatto.com.br | GitHub | uHunt | CV Lattes | Last.fm
[WWW]
Dryca
What is classpath?
[Avatar]

Membro desde: 09/03/2010 10:10:00
Mensagens: 7
Offline

galera valew por lembrar dessa classe..
eu sei que seria muto mais facil usar essa classe
mas preciso de implementar essa classe..
nao posso usar o pacote, preciso faze-la
estava pensando em transformar o numero em String e depois pegar caracter por caracter colocar em doias arrays e somar...
mas queria um exemplo de codigo que fizesse isso.
pvrsouza
Virtual Machine Man
[Avatar]

Membro desde: 04/08/2009 09:50:14
Mensagens: 500
Localização: Salvador-BA
Offline

Exemplo:

mario.fts
GUJ Ranger
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 809
Localização: São Paulo - ZL
Offline

Pq vc não poderia utilizar? Elas não são pacotes de terceiros, fazem parte da API padrão do java.

This message was edited 1 time. Last update was at 12/03/2010 10:37:19


Mário Amaral Gonçalves

"Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra
[Email]
Dryca
What is classpath?
[Avatar]

Membro desde: 09/03/2010 10:10:00
Mensagens: 7
Offline

nao posso usar pq é um trabalho que estou fazendo e é necessário que eu faça uma classe que faça exatamente a soma que a java.math.BigInteger faz.
Obrigado.
mark_domi
JavaGuru

Membro desde: 30/01/2004 16:35:03
Mensagens: 243
Offline

mario.fts wrote:Pq vc não poderia utilizar? Elas não são pacotes de terceiros, fazem parte da API padrão do java.


Trabalho da faculdade, aposto.

http://www.sentirepensar.com.br
mario.fts
GUJ Ranger
[Avatar]

Membro desde: 14/05/2008 09:41:06
Mensagens: 809
Localização: São Paulo - ZL
Offline

aaaaaaa taaaaaaa. não tinha percebido q era um trabalho.

boa sorte.

Mário Amaral Gonçalves

"Ciência da computação tem tanto a ver com o computador como a Astronomia com o telescópio, a Biologia com o microscópio, ou a Química com os tubos de ensaio. A Ciência não estuda ferramentas, mas o que fazemos e o que descobrimos com elas." - Edsger Dijkstra
[Email]
Felagund
GUJ Master
[Avatar]

Membro desde: 26/07/2006 11:51:36
Mensagens: 1732
Localização: Santa e Bela Catarina
Offline

vc pode armazenar em um long, pois ele guarda diversos números, vc pode ver o padrão Money Implementado em java, pode te ajudar

http://www.javabuilding.com/academy/patterns/money.html

esse post do Sergio Taborda é muito interessante.


att
Rafael Felix

Rolling With Code
Twitter
[WWW]
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5089
Online

Vou dar um exemplo do que você pode fazer.

Digamos que você tenha os seguintes números:

31415926535897932384626433832795

e

27182818284590452353602874713527

Você sabe que ao somar esses dois números, o resultado deve ser

58598744820488384738229308546322

Vamos ver como se chega a esse resultado.

A primeira coisa é você criar um método que receba uma string, e converta para um array de ints, cada int contendo 9 algarismos.
Você põe os algarismos de trás para frente, de 9 em 9 posições.
Vou mostrar o que eu quero que você faça.

O comprimento da string 31415926535897932384626433832795 é 32. Isso quer dizer que eu tenho de quebrar em (32 + 9 - 1) / 9 = 4 pedaços. Então você cria um array de 4 ints, com o seguinte conteúdo:
a [0] = 433832795
a [1] = 932384626
a [2] = 926535897
a [3] = 31415

Mostro abaixo com os números de 1 a 9, para ficar mais fácil você entender de onde eu peguei os dígitos.

31415 926535897 932384626 433832795
56789 123456789 123456789 123456789

A mesma coisa você faz com 27182818284590452353602874713527, que vai dar:
b [0] = 874713527
b [1] = 452353602
b [2] = 818284590
b [3] = 27182

27182 818284590 452353602 874713527
56789 123456789 123456789 123456789

Agora é que vou realmente fazer a soma. Crie um array de ints cujo tamanho é igual ao maior tamanho entre os arrays a e b, mais um:
- ou seja, crie um array c com 5 posições.
Some as posições correspondentes. Se um dos arrays for mais curto que o outro, considere que o valor é zero.

c[0] = a[0] + b[0] = 1308546322
c[1] = a[1] + b[1] = 1384738228
c[2] = a[2] + b[2] = 1744820487
c[3] = a[3] + b[3] = 58597
c[4] = 0

Você já está começando a entender? Agora vamos fazer uma correção porque, na nossa notação, todos os números não podem ter mais de 9 algarismos. Se o número tiver mais de 9 algarismos, então tire o algarismo que sobrar, e some-o com o número que está na próxima posição do array. Nesse caso:

c[0] = 1308546322, mas é >= 1000000000, então vamos achar o resto da divisão por 1000000000, que vai dar 308546322
Ou seja, c[0] = 308546322. A divisão de 1308546322 por 1000000000 dá 1, que será somada a c[1].
c[1] = 1384738228 + 1 = 1384738229
Achando o resto e fazendo a divisão, vemos que c[1] = 384738229 e devemos somar 1 a c[2].
c[2] = 1744820487 + 1 = 1744820488
Então c[2] = 744820488, devemos somar 1 a c[3]
c[3] = 58597 + 1 = 58598
c[4] = 0

Para converter o número de novo para uma string, devemos então pegar cada int no array c, e imprimi-lo com 9 algarismos, completando com zeros à esquerda se for o caso. Não se esquecer que é para pegar cada número de trás para frente. Pus alguns espaços para você entender melhor.

000000000 000058598 744820488 384738229 308546322

Agora, vamos comparar com o resultado esperado:

58598744820488384738229308546322

Viu? Deu igualzinho.

O que mostrei funciona em Java, C, VB, não importa a linguagem.

This message was edited 1 time. Last update was at 12/03/2010 11:07:43

Dryca
What is classpath?
[Avatar]

Membro desde: 09/03/2010 10:10:00
Mensagens: 7
Offline

oi galera,
nao é trabalho de faculdade nao..
essa faz parte d uma serie de questoes que me foram passadas no meu trabalho.
esta é a unica que estou com duvida de como fazer, e gostaria só de algum exemplo ou ideia.
Dryca
What is classpath?
[Avatar]

Membro desde: 09/03/2010 10:10:00
Mensagens: 7
Offline

Obrigado entanglement :
vou tentar fazer o codigo e depois posto aqui.
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5089
Online

A multiplicação é um bocadinho mais chata de fazer, e o algoritmo "ingênuo" (que é igual ao que você faria à mão) é um pouco ineficiente. Existem algoritmos mais eficientes para efetuar multiplicações de números grandes.
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3420
Offline

Felagund wrote:vc pode armazenar em um long, pois ele guarda diversos números, vc pode ver o padrão Money Implementado em java, pode te ajudar

http://www.javabuilding.com/academy/patterns/money.html

esse post do Sergio Taborda é muito interessante.



O truque do long só se aplica ao padrão Money e não à soma de numero arbitráriamente grandes. É que o máximo valor de um long em dinheiro,em qualquer moeda, é grande o suficiente.

Para aritmética de inteiros enormes, BigInteger é o cara. A mecanismo do BigInteger é separar os algarismos numa array de int em que cada elemento vai de 0 a 9 e somar como fazemos à mão. mas o biginteger também é limitado ao numero de elementos num array que é a quantidade de inteiros positivos.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team