Converter Numeração Arabe para Numeração Romana - Pascal - Portugal-a-Programar
Converter Numeração Arabe para Numeração Romana
Por Death_Skull, 29 de Novembro de 2006 em Pascal
Death_Skull 0
Tenho um projecto para uma cadeira (introdução à programação), na qual temos de construir um conversor que permita transformar um numero introduzido pelo utilizador em numeração romana. Declararei dois vectrores um onde estavam os numeros arabes ( 1, 4, 5, 9,10,40,50,90,100,400,500,1000) e outro vector onde estavam os seus correspondentes em numeração romana ( 'I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M' ), depois pedia que fosse introduzido um numero pelo utilizado,
write ('introduza um numero ');
digito:=numero mod 10;
sdigito:= numero div 10;
romano:= sdigito;
agora o meu problema esta relacionado com a conversão propriamente dita, ou seja imaginemos que o numero introduzido é 6? o romano vai ser 6, mas o 6 não esta contemplado no vector, como é que posso fazer para que o programa possa associar o seis a VI que é a soma entre 5 +1? desculpem a pergunta de noob, :-[
Acho que podes fazer algo do tipo:
Associar I a 1
Se o numero for maior que 0 e menor que 4, o numero de i's que vão aparecer é igual ao numero em numeração árabe
Se o valor for 4 então aparece o simbolo desse valor + 1 (neste caso 4+1=5=V) com o I atrás (-1)
Seguir o raciocínio para os restantes
Isto são apenas ideias (que podem não ser as mais correctas).
Primeiro acho que não é nenhuma pergunta de noob e não tens de pedir desculpa...
Assim à primeira vista o que eu faria era o seguinte: tentar subtrair o maior número que tens no vector. Caso o número a subtrair fosse maior que o originalmente introduzido pelo utilizador passava ao número imediatamente menor. Á medida que fazes isto vais guardando noutro vector o número de vezes que encontras cada número. No fim basta veres quantos tens de cada e pela ordem que foste guardando sabes os números que tens de mostrar.
Isto foi muito confuso, agora não tenho muito tempo e paciência para explicar, mas depois vou tentar pensar melhor sobre o assunto.
Experimenta a seguinte aproximação por divisões e subtrações.
Ao preencher o numero romano tens de achar a letra que vaz usar, para fazer isso deves dividir por constantes basicas, começando por baixo, até achar a divisão que tenha resultado <= 3. Só interessa a parte positiva.
Para achar a seguinte letra deves subtrair o valor da letra que achaste ao valor inicial que tinhas, ficando com o proximo valor para a proxima letra. Se o resultado da divisão for negativo deves colocar a letra que tem o valor anterior antes da letra que já tinhas. LOL complicado?
As peças básicas são I V X L C D M etc.
Vai 1 exemplos:
444/C = 4.44 // <=3? não descarta, passa ao seguinte:
444/D = 0.888 // <=3? sim então começamos com D --> D
444-D = -56 // negativo? sim então a letra abaixo de D é C --> CD
444-CD=44 // negativo? não passa a encontrar letra
44/X=4.4 // <=3? não descarta, passa ao seguinte:
44/L=0.88 // <=3? sim então --> CD L
44-L=-6 // negativo? sim, então a letra abaixo de L é X --> CDXL
44-XL=4 // negativo? não passa a letra
4/V=0.8 // <=3? sim então --> CDXL V
4-V=-1 // negativo? sim, letra abaxo I --> CDXLIV
4-IV=0 Finalizou...
Quando o resultado da subtração é 2 ou 3 tens de usar XX ou LLL etc, conforma a situação. O resultado da divisão dá a pista para o numero de letras a usar.
Experimenta para mais numero e vê se resulta.
Eu experimentei e pareceu-me bem.
shumy: Muito bom algoritmo
Amanha falamos... parece-me ter conseguido um melhor, tenho de confirmar.
E o anterior tem um problema (pelo menos 1), não contempla a regra romana que impede de usar simbolos repetidos que não sejam multiplos de 10. Tipo VVV para representar 15.