O exercício de numeração romana é interessante! Foi mais "braçal", mas interessante mesmo assim. Confira abaixo!
Plataforma: URI (BEECROWD)
Problema: 1960
Enunciado:
A ECI (Editio Chronica Incredibilis ou Editora de Crônicas Incríveis) é muito tradicional quando se trata de numerar as páginas de seus livros. Ela sempre usa a numeração romana para isso. E seus livros nunca ultrapassam as 999 páginas pois, quando necessário, dividem o livro em volumes.
Você deve escrever um programa que, dado um número arábico, mostra seu equivalente na numeração romana.
Lembre que I representa 1, V é 5, X é 10, L é 50, C é 100, D é 500 e M representa 1000.
Linguagens: C e C++
Solução:
O segredo aqui é separar os valores em unidade, dezena e centena, e com base em cada caso que gera uma letra diferente ou um conjunto de letras. Por exemplo, o valor 9 é representado por IX. O valor 10 é representado por X. O valor 900 é CM. A iteração deve acontecer enquanto existir o valor n.
Código em C:
#include <stdio.h> int main() { int n, resto, contador = 1; char unidade[5]; char dezena[5]; char centena[5]; scanf("%i", &n); unidade[5] = NULL; dezena[5] = NULL; centena[5] = NULL; while (n) { resto = n % (10 * contador); contador *= 10; n -= resto; switch (resto) { case 0: if (contador==10) strcpy(unidade, ""); break; case 1: strcpy(unidade, "I"); break; case 2: strcpy(unidade, "II"); break; case 3: strcpy(unidade, "III"); break; case 4: strcpy(unidade, "IV"); break; case 5: strcpy(unidade, "V"); break; case 6: strcpy(unidade, "VI"); break; case 7: strcpy(unidade, "VII"); break; case 8: strcpy(unidade, "VIII"); break; case 9: strcpy(unidade, "IX"); break; case 10: strcpy(dezena, "X"); break; case 20: strcpy(dezena, "XX"); break; case 30: strcpy(dezena, "XXX"); break; case 40: strcpy(dezena, "XL"); break; case 50: strcpy(dezena, "L"); break; case 60: strcpy(dezena, "LX"); break; case 70: strcpy(dezena, "LXX"); break; case 80: strcpy(dezena, "LXXX"); break; case 90: strcpy(dezena, "XC"); break; case 100: strcpy(centena, "C"); break; case 200: strcpy(centena, "CC"); break; case 300: strcpy(centena, "CCC"); break; case 400: strcpy(centena, "CD"); break; case 500: strcpy(centena, "D"); break; case 600: strcpy(centena, "DC"); break; case 700: strcpy(centena, "DCC"); break; case 800: strcpy(centena, "DCCC"); break; case 900: strcpy(centena, "CM"); break; default: break; } } printf("%s%s%s\n", centena, dezena, unidade); return 0; }
Código em C++:
#include <iostream> #include <string.h> using namespace std; int main() { int n, resto, contador = 1; string unidade = "", dezena = "", centena = ""; cin >> n; while (n) { resto = n % (10 * contador); contador *= 10; n -= resto; switch (resto) { case 0: break; case 1: unidade = "I"; break; case 2: unidade = "II"; break; case 3: unidade = "III"; break; case 4: unidade = "IV"; break; case 5: unidade = "V"; break; case 6: unidade = "VI"; break; case 7: unidade = "VII"; break; case 8: unidade = "VIII"; break; case 9: unidade = "IX"; break; case 10: dezena = "X"; break; case 20: dezena = "XX"; break; case 30: dezena = "XXX"; break; case 40: dezena = "XL"; break; case 50: dezena = "L"; break; case 60: dezena = "LX"; break; case 70: dezena = "LXX"; break; case 80: dezena = "LXXX"; break; case 90: dezena = "XC"; break; case 100: centena = "C"; break; case 200: centena = "CC"; break; case 300: centena = "CCC"; break; case 400: centena = "CD"; break; case 500: centena = "D"; break; case 600: centena = "DC"; break; case 700: centena = "DCC"; break; case 800: centena = "DCCC"; break; case 900: centena = "CM"; break; default: break; } } cout << centena << dezena << unidade << endl; return 0; }