%cabeçalho para todos os capítulos
%\input{cabecalho}

%\begin{document}

%Opções para o pacote listings
%\input{listingOptions}

%\chapter{Exercícios}

\chapter{Manipulando números utilizando diferentes bases}

\begin{center}
\shabox{
  \begin{Bitemize}
    \item[]\textbf{Quais novidades veremos nesta aula?}
    \item Como extrair os dígitos de um número
    \item Como converter números de uma base para outra
  \end{Bitemize}
} % \shabox
\end{center}
\bigskip

Nesta aula, aprendemos como extrair e processar os dígitos de um número
inteiro. 
Exemplos:
\begin{enumerate}

  \item Imprimir um número natural dígito por dígito.
    
  \item Dado um número natural $n$, na base binária, convertê-lo para a base
    decimal. \emph{Exemplo:} Dado 10010 a saída deve ser 18 pois: $1*2^4 +
    0*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 18$.

\end{enumerate}

Veja agora com cuidado a implementação da classe Conversão que converte
números binários para decimais e vice-versa. Não é muito fácil entender o
funcionamento de seus métodos; sugerimos fortemente então, que você tente
rastrear\footnote{Rastrear a execução de um programa significa construir uma
  tabela contendo colunas correspondentes às variáveis do programa e simular a
  sua execução indicando os valores que as variáveis recebem ao longo do
  tempo. Se o programa imprimir texto (usando \texttt{System.out.println})
  esse texto tem que ser indicado como \emph{saída}) e se os métodos devolvem
  algum valor (com o comando \texttt{return}) este valor tem que ser
  destacado.} a execução dos dois métodos.

\begin{lstlisting}
  class Conversão
  {
    int binárioParaDecimal(int n)
    {
      int dec = 0;
      int pot2  = 1;

      while (n != 0){
        /* processa um dígito binário */
        dec = dec + n % 10 * pot2;
        n = n / 10;
        pot2 = pot2 * 2;
      }
      return dec;
    }

    int decimalParaBinário(int n)
    {
      int dig;
      int bin = 0;
      int pot = 1;

      while (n > 0) {
        /* extrai próximo dígito binário menos significativo (mais à direita) */
        dig = n % 2;
        /* remove esse dígito do n */
        n = n / 2;
        /* adiciona o dígito como o mais significativo até o momento */
        bin = bin + dig * pot;
        pot = pot * 10;
      }
      return bin;
    }
  }
\end{lstlisting}

\section{Exercícios}

\begin{enumerate}
  
\item Dado um número natural \texttt{n}, contar quantos dígitos ele tem. Não
  esqueça de considerar o caso do número ser igual a zero!

\item Dado um número verificar se o mesmo possui dois dígitos consecutivos iguais.
      Para resolver este problema podemos usar um técnica denominada
      indicador de passagem, para isto, inicialmente vamos supor que o
      número não contém dígitos iguais. Verificaremos cada par de
      dígitos consecutivos, caso algum deles seja igual saberemos que
      ele contém dígitos consecutivos iguais. Em outras palavras, vamos
      inicializar uma variável booleana com falso, vamos testar a
      condição para todos os dígitos consecutivos, se forem iguais
      mudamos a condição. Ao final, a resposta vai corresponder ao
      estado final desta condição.

\item Dado um número natural \texttt{n}, verificar se \texttt{n} é, ou não palíndromo. Um número palíndromo é um número que lido de trás para frente é o mesmo número de quando lido normalmente, por exemplo:

\begin{itemize}
\item 78087
\item 1221
\item 11111
\item 3456 não é palindromo!!!
\end{itemize}

Duas maneiras de se resolver estes problemas são apresentadas abaixo. Escreva as soluções para cada uma delas.

\begin{itemize}
  \item A forma mais fácil é construir o número inverso e compará-lo com o original.
  \item A outra solução consiste em supor inicialmente que o número é palíndromo, e em seguida verificar se a condição de igualdade é válida para os extremos.
\end{itemize}

Se o número for negativo, considere apenas o seu valor absoluto (isso é apenas uma convenção nossa para este exercício). Por exemplo, -2002 deve ser considerado palíndromo.

\emph{Curiosidade:} números palíndromos também são conhecidos por \emph{capicuas}.


\item Uma propriedade de números naturais é a seguinte: um número sempre é maior do que o produto dos seus dígitos. Faça uma classe com dois métodos: \texttt{int calculaProd(int n)}, que calcula o produto dos dígitos de um número natural \texttt{n}, e \texttt{boolean verificaProp(int n)}, que verifica se a propriedade é válida para um número \texttt{n} dado.

\item Crie métodos para converter uma \texttt{String} contendo um número em algarismo romanos em um inteiro e vice-versa.

\item Crie uma classe contendo um método que recebe um inteiro e o imprime representado em notação científica. Por exemplo,

\begin{verbatim}
> Inteiro i = new Inteiro();
> i.carregaValor(1356);
> i.imprimeEmNotacaoCientifica();
1,356e3
> i.carregaValor(-102);
> i.imprimeEmNotacaoCientifica();
-1,02e2
> i.carregaValor(7);
> i.imprimeEmNotacaoCientifica();
7,0e0
> i.carregaValor(900200);
> i.imprimeEmNotacaoCientifica();
9,002e5
\end{verbatim}

\item Implemente a operação de divisão de dois números inteiros utilizando apenas laços e os operadores \texttt{+}, \texttt{-} e \texttt{\%}.

\end{enumerate}

%\end{document}
