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
=========================================================================