3596 - Cifre Romane 2
Cerința
Alexandru a învăţat că pe lângă cifrele romane I, V, X, L, C, D, M mai există cifrele (V), (X), (L), (C), (D), (M) care au valorile 5000, 10000, 50000, 100000, 500000 respectiv 1000000. Dându-se un număr c:
- pentru c=1, se dă numărul a scris cu cifre arabe și trebuie să-l scrieti cu cifre romane.
- pentru c=2, se dă numărul b scris cu cifre romane și trebuie să-l scrieti cu cifre arabe.
Date de intrare
Fișierul de intrare cifre_romane2.in conține pe prima linie numărul c, iar pe a doua linie, dacă c=1 atunci se citește numarul a . Dacă c=2 atunci se citește numărul b.
Date de ieșire
Fișierul de ieșire cifre_romane2.out va conține pe prima linie :
- dacă c=1 atunci se va afișa numărul a scris cu cifre romane
- dacă c=2 atunci afișăm numărul b dacă acesta este valid sau mesajul Numar invalid dacă acesta nu este valid.
Restricții și precizări
- 1≤a,b≤3999999
- Cifrele romane sunt:
- I=1
- V=5
- X=10
- L=50
- C=100
- D=500
- M=1000
- (V)=5000
- (X)=10000
- (L)=50000
- (C)=100000
- (D)=500000
- (M)=1000000
Exemplul 1:
- cifre_romane2.in
- 1
- 758
- cifre_romane2.out
- DCCLVIII
Exemplul 2:
- cifre_romane2.in
- 2
- MDLI
- cifre_romane2.out
- 1551
Exemplul 3:
- cifre_romane2.in
- 1
- MDLI
- cifre_romane2.out
- invalid
Rezolvare
<syntaxhighlight lang="python" line="1">
- 3596 Cifre_romane2
def arabic_to_roman(number):
numere_romane = { 1: 'I', 4: 'IV', 5: 'V', 9: 'IX', 10: 'X', 40: 'XL', 50: 'L', 90: 'XC', 100: 'C', 400: 'CD', 500: 'D', 900: 'CM', 1000: 'M', 5000: '(V)', 10000: '(X)', 50000: '(L)', 100000: '(C)', 500000: '(D)', 1000000: '(M)' }
result = "" for value, numeral in sorted(numere_romane.items(), key=lambda x: x[0], reverse=True): while number >= value: result += numeral number -= value
return result
def roman_to_arabic(roman):
numere_romane = { 'I': 1, 'IV': 4, 'V': 5, 'IX': 9, 'X': 10, 'XL': 40, 'L': 50, 'XC': 90, 'C': 100, 'CD': 400, 'D': 500, 'CM': 900, 'M': 1000, '(V)': 5000, '(X)': 10000, '(L)': 50000, '(C)': 100000, '(D)': 500000, '(M)': 1000000 }
result = 0 prev_value = 0
for numeral in reversed(roman): value = numere_romane[numeral] if value < prev_value: result -= value else: result += value prev_value = value
return result
def main():
with open("cifre_romane2.in", "r") as input_file, open("cifre_romane2.out", "w") as output_file: try: c = int(input_file.readline().strip()) except ValueError: output_file.write("Numar invalid\n") return
if c == 1: try: a = int(input_file.readline().strip()) roman_a = arabic_to_roman(a) output_file.write(roman_a + "\n") except ValueError: output_file.write("Numar invalid\n") elif c == 2: b = input_file.readline().strip() try: arabic_b = roman_to_arabic(b) if 1 <= arabic_b <= 3999999: output_file.write(str(arabic_b) + "\n") else: output_file.write("Numar invalid\n") except KeyError: output_file.write("Numar invalid\n") except ValueError: output_file.write("Numar invalid\n") else: output_file.write("Numar invalid\n")
if __name__ == "__main__":
main()
</syntaxhighlight>