3596 - Cifre Romane 2
De la Universitas MediaWiki
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
#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()