[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [obm-l] Conversão de Números em Base Negativa
Henrique Rennó wrote:
> Eu acredito que a função mod implementada em linguagens de programação
> podem diferir em resultado. Acredito que isso deva ser um assunto bem
> antigo, pois a função mod deve existir desde que as linguagens
> começaram a ser implementadas.
Sim, isso é verdade. Em C, por exemplo, (-1)%2 = -1. Já em Python,
(-1)%2=1. Em Haskell tem os dois jeitos, você pode usar "rem" ou "mod".
Nesses casos é bom pegar a referência da linguagem que você está usando.
No caso específico da conversão de números, use o módulo dos dois lados
pra garantir o resultado não-negativo.
> A conversão 1001(10) para base (-2) seria o problema de achar os
> valores de N e A[i] (0 <= i <= N) para os quais a seguinte igualdade
> seja verdadeira (na verdade termos com base elevada a valores > N
> seriam 0, ou seja, A[j] = 0 para j > N):
>
> 1*(10)^3 + 0.(10)^2 + 0.(10)^1 + 1.(10)^0 = A[N]*(-2)^N +
> A[N-1]*(-2)^(N-1) + A[N-2]*(-2)^(N-2) + ... + A[1]*(-2)^1 + A[0]*(-2)^0
Tá certinho, só faltou dizer que 0<=A[i]<abs(N)
Não é difícil continuar daqui, basta notar que você pode isolar um
(-2)^1 no lado direito:
x = (A[N]*(-1)^(N-1)+.....+A[1]*(-2)^0) * (-2)^1 + A[0]*(-2)^0
x - A[0] = (A[N]*(-1)^(N-1)+.....+A[1]*(-2)^0) * (-2)
Ou seja (x-A[0]) precisa ser um múltiplo de (-2), o que justifica a
passagem na conversão. O algoritmo então fica:
1. Ache A[0] tal que 0<=A[0]<abs(N) e (x-A[0]) seja múltiplo de (-2)
2. Calcule (x-A[0])/(-2) = A[N]*(-1)^(N-1)+.....+A[1]*(-2)^0
3. Você reduziu o problema ao caso anterior, itere até acabar.
--
Ricardo Bittencourt
=========================================================================
Instruções para entrar na lista, sair da lista e usar a lista em
http://www.mat.puc-rio.br/~nicolau/olimp/obm-l.html
=========================================================================