3596 - Cifre Romane 2: Difference between revisions
Cristina94 (talk | contribs) Pagină nouă: ==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 co... |
Cristina94 (talk | contribs) mNo edit summary |
||
Line 57: | Line 57: | ||
==Rezolvare== | ==Rezolvare== | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line="1"> | ||
#3596 Cifre_romane2 | #3596 Cifre_romane2 | ||
def arabic_to_roman(number): | def arabic_to_roman(number): | ||
Line 98: | Line 98: | ||
def main(): | def main(): | ||
with open("cifre_romane2.in", "r") as input_file, open("cifre_romane2.out", "w") as output_file: | with open("cifre_romane2.in", "r") as input_file, open("cifre_romane2.out", "w") as output_file: | ||
c = int(input_file.readline().strip()) | try: | ||
c = int(input_file.readline().strip()) | |||
except ValueError: | |||
output_file.write("Numar invalid\n") | |||
return | |||
if c == 1: | if c == 1: | ||
a = int(input_file.readline().strip()) | 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: | elif c == 2: | ||
b = input_file.readline().strip() | b = input_file.readline().strip() | ||
Line 114: | Line 121: | ||
except KeyError: | except KeyError: | ||
output_file.write("Numar invalid\n") | output_file.write("Numar invalid\n") | ||
except ValueError: | |||
output_file.write("Numar invalid\n") | |||
else: | |||
output_file.write("Numar invalid\n") | |||
Latest revision as of 16:40, 5 February 2024
Cerința[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 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:[edit | edit source]
- cifre_romane2.in
- 1
- 758
- cifre_romane2.out
- DCCLVIII
Exemplul 2:[edit | edit source]
- cifre_romane2.in
- 2
- MDLI
- cifre_romane2.out
- 1551
Exemplul 3:[edit | edit source]
- cifre_romane2.in
- 1
- MDLI
- cifre_romane2.out
- invalid
Rezolvare[edit | edit source]
<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>