Death_Skull Posted November 29, 2006 at 11:09 PM Report #67829 Posted November 29, 2006 at 11:09 PM Boas! 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 '); read (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, ?
maiden Posted November 29, 2006 at 11:47 PM Report #67855 Posted November 29, 2006 at 11:47 PM Boas, 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). Espero ter ajudado. Cumps,
Triton Posted November 29, 2006 at 11:52 PM Report #67858 Posted November 29, 2006 at 11:52 PM 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. <3 life
shumy Posted November 30, 2006 at 12:51 AM Report #67878 Posted November 30, 2006 at 12:51 AM 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: Inicio: 444 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... Compreendido? 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. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Saco Posted November 30, 2006 at 01:13 AM Report #67881 Posted November 30, 2006 at 01:13 AM shumy: Muito bom algoritmo 🙂
shumy Posted November 30, 2006 at 01:32 AM Report #67884 Posted November 30, 2006 at 01:32 AM 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. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now