Matemática

Problema 1193

Descrição

O professor de matemática de Juliano marcou uma prova cujo conteúdo será apenas conversão entre valores decimais, hexadecimais e binários. Uma das coisas mais complexas para Juliano é fazer estas conversões de base entre números. Por mais que estude, tem muita dificuldade para entender. Portanto, como você entende de computação e é amigo(a) de Juliano, ele solicitou a tua ajuda para que faça um programa que verifique se as conversões feitas por ele estão correta.

Entrada

A entrada contém vários casos de teste. A primeira linha da entrada contém um inteiro N, indicando o número de casos de teste que virão a seguir, um por linha. Cada caso de teste contém um valor X (X > 0) seguido de um texto Y com três caracteres, indicando se o valor X está no formato binário, decimal ou hexadecimal. Independente do formato, qualquer dos números deverá caber em um inteiro de 32 bits.

Saída

Para cada caso de teste, você deve apresentar o número de caso de teste seguido por duas linhas, que contém a conversão do valor fornecido para as outras duas bases. A sequência das bases de saída será sempre: decimal, hexadecimal (em minúsculo) e binário, ou seja deve-se respeitar esta ordem excluindo obviamente o formato de entrada.

Obs: deverá ser impressa uma linha em branco após cada caso de teste, inclusive após o último caso de teste.

Código

  1. include <iostream>

using namespace std;

  1. include <stdio.h>
  2. include <stdlib.h>

int bin_to_dec(int bin) {

   int total  = 0;
   int potenc = 1;
  
   while(bin > 0) {
       total += bin % 10 * potenc;
       bin    = bin / 10;
       potenc = potenc * 2;
   }
  
   return total;

}

int main() {

   int x,n;
   char y='b',k[10];
   std::string name;
   int j = 0;
   cin >> n;
   for(int i=0;i<n;i++){
       cin >> x;
       cin>>y;
       getline (std::cin,name);
       j++;
       switch(y){
           case 'b':
               x=bin_to_dec(x);
               printf("Case %d:\n%d dec\n%x hex\n\n",j,x,x);
               break;
           case 'h':
               itoa(x,k,2);
               printf("Case %d:\n%d dec\n%s bin\n\n",j,x,k);
               break;
           case 'd':
               itoa(x,k,2);
               printf("Case %d:\n%x hex\n%s bin\n\n",j,x,k);
               break;
       }
   }
  
  
   return 0;

}

Observações e explicações

  • Explicação: Usando algumas propriedades da função printf, de imprimir um número em hexadecimal direto, sem fazer conversão, o problema maior seria imprimir em base binária, usando alguma função própria do c++.
  • OBS: Como pode-se ver, esse código usa a função itoa (que muda um numero da base decimal para binária) da biblioteca <stdlib.h>. Se alguém conseguir mudá-lo colocando uma nova função que substitua essa, o URI concerteza vai aceitar.





Problema 1393 - Código

  1. include <iostream>

using namespace std;

int main() {

   int i,n,v[50];
   v[0]=0;
   v[1]=1;
   v[2]=2;
   for(i=3;i<45;i++){
       v[i] = v[i-1] + v[i-2];
   }
   while(cin>>n){
       if(n==0) break;
       cout << v[n] << endl;
   }
   return 0;

}