Java Puzzles - Puzzle 3: Long Division

5 views
Skip to first unread message

Maurício Linhares

unread,
Feb 22, 2008, 3:34:43 PM2/22/08
to PBJUG
E mais um quebra-cabeças pras mentes desocupadas =D

Lembrando mais uma vez, não adianta só responder com "é assim" ou "é
assado". A idéia é que você, além de estimular o seu conhecimento
sobre Java e programação em geral, também estimule a sua capacidade de
organizar e explicar as idéias (e isso é bem mais importante do que
você imagina). Não tenham medo de rodar o código nas suas máquinas,
isso não é uma certificação e as soluções dificilmente vão vir de mão
beijada =D

Boa sorte a todos!

Puzzle 3: Long Division

Esse quebra-cabeça é chamado de "long division" porque ele é um
programa que divide dois valores do tipo "long". O dividendo
representa o número de microsegundos em um dia; o divisor, o número de
milisegundos em um dia. O que esse programa imprime? Ele está correto?
Se não, o que fazer pra deixar ele correto?

public class LongDivision {


public static void main(String[] args) {


final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;


final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;


System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);


}


}


Dica: Frações?

--
Maurício Linhares
http://alinhavado.wordpress.com/ (pt-br) |
http://codeshooter.wordpress.com/ (en)
João Pessoa, PB, +55 83 8867-7208

Clovis Leoncio Junior

unread,
Feb 22, 2008, 4:00:56 PM2/22/08
to pb...@googlegroups.com
O erro no código é que as váriaveis inteiras são automaticamente do tipo int e não long. A operação inteira irá ser calculada com 32 bits para só no final ser atribuída para o long. Como o resultado da multiplicação do MICROS_PER_DAY é maior que um int acontecerá um overflow antes da atribuição.
Uma maneira de resolver isso seria:

final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000L;

Como o último número é um long isso  forçará a VM a tratar a operação neste nível.

(Tá... Minha explicação não é das mais articuladas mas tá certa...)

2008/2/22 Maurício Linhares <mauricio...@gmail.com>:



--
Clovis Leoncio Junior

Maurício Linhares

unread,
Feb 22, 2008, 4:24:22 PM2/22/08
to pb...@googlegroups.com
A explicação ficou muito boa :)

Moral da história?

Muito cuidado com overflow (que é ter um resultado grande demais sendo
colocado em uma variável onde ele não cabe), em Java não existe
nenhuma proteção pra isso, então você não vai ver uma exceção quando o
resultado de uma operação for "perdido" (a não ser em casos
explícitos, aonde você tenta atribuir um long a um int, por exemplo).

2008/2/22 Clovis Leoncio Junior <clovis...@gmail.com>:


> O erro no código é que as váriaveis inteiras são automaticamente do tipo int
> e não long. A operação inteira irá ser calculada com 32 bits para só no
> final ser atribuída para o long. Como o resultado da multiplicação do
> MICROS_PER_DAY é maior que um int acontecerá um overflow antes da
> atribuição.
> Uma maneira de resolver isso seria:
>
> final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000L;
>
> Como o último número é um long isso forçará a VM a tratar a operação neste
> nível.
>
> (Tá... Minha explicação não é das mais articuladas mas tá certa...)

Bonifacio Segundo

unread,
Feb 22, 2008, 4:39:37 PM2/22/08
to pb...@googlegroups.com
26 minutos?
It's a new record!

Problema interessante.

Em 22/02/08, Maurício Linhares<mauricio...@gmail.com> escreveu:


--
Bonifacio Segundo

Reply all
Reply to author
Forward
0 new messages