1923 - Cifre egale
De la Universitas MediaWiki
Cerinţa
Afişaţi, în ordine crescătoare, toate numerele dintr-un anumit interval care au toate cifrele egale. Sunt două tipuri de cerinţe:
- 1. se dau a şi b si se cer toate numerele din intervalul a, b (inclusiv, eventual, capetele).
- 2. Se da x si se cer toate numerele cu maxim x cifre.
Date de intrare
Din fişierul egalein.txt se citeşte mai întâi un număr T. Dacă T este 1 pe a doua linie sunt două numere a şi b, separate prin spaţiu. Dacă T este 2, pe a doua linie va fi numărul x.
Date de ieşire
In fişierul egaleout.txt se scriu, pe un rând numerele cerute separate prin câte un spaţiu.
Restricții și precizări
- 1 ⩽ a ⩽ b ⩽ 10 17
- 1 ⩽ x ⩽ 100
- Pentru 20% din punctaj avem T = 1 şi 1 ⩽ a, b ⩽ 10 4
- Pentru încă 20% din punctaj avem T = 1 şi 10 8 ⩽ a, b ⩽ 10 9
- Pentru încă 10% din punctaj avem T = 1 şi a, b > 10 9
- Pentru 50% din punctaj avem T=2
Exemplul 1
- egalein.txt
1 8 30
- egaleout.txt
Datele de intrare corespund restrictiilor impuse 8 9 11 22
Exemplul 2
- egalein.txt
2 2
- egaleout.txt
Datele de intrare corespund restrictiilor impuse 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99
Exemplul 3
- egalein.txt
-19999 5 9 0
- egaleout.txt
Datele de intrare nu corespund restrictiilor impuse
Rezolvare
# 1923 Cifre egale
def validare(t_validare, a_validare, b_validare, x_validare):
# Verificăm dacă t este în intervalul 1-2
if t_validare < 1 or t_validare > 2:
raise ValueError # Ridicăm o eroare dacă t nu este în intervalul 1-2
# Dacă t este 1, verificăm dacă a și b sunt în intervalul 1-10^17
if t_validare == 1:
if a_validare < 1 or b_validare > 10**17:
raise ValueError # Ridicăm o eroare dacă a sau b nu sunt în intervalul 1-10^17
else:
# Dacă t nu este 1, verificăm dacă x este în intervalul 1-100
if x_validare < 1 or x_validare > 100:
raise ValueError # Ridicăm o eroare dacă x nu este în intervalul 1-100
file_out.write("Datele de intrare corespund restrictiilor impuse\n")
def numere_egale(t_egale, a_egale, b_egale, x_egale):
rezultate_egale = [] # Inițializăm o listă goală pentru a stoca rezultatele
# Dacă t este 1, setăm start și end la a și b + 1, respectiv
if t_egale == 1:
start = a_egale
end = b_egale + 1
else:
start = 1 # Dacă t nu este 1, setăm start la 1 și end la 10 la puterea x
end = 10 ** x_egale
for i in range(start, end): # Parcurgem fiecare număr în intervalul de la start la end
if len(set(str(i))) == 1:
rezultate_egale.append(i)
return rezultate_egale # Returnăm lista de rezultate
if __name__ == '__main__':
file_in = open("egalein.txt", "r") # Deschidem fișierul de intrare pentru citire
file_out = open("egaleout.txt", "w") # Deschidem fișierul de ieșire pentru scriere
try:
T_main = int(file_in.readline()) # Citim tipul de cerință
if T_main == 1:
# Citim capetele intervalului
a_main, b_main = map(int, file_in.readline().split())
x_main = None
else:
x_main = int(file_in.readline()) # Citim numărul maxim de cifre
a_main = b_main = None
validare(T_main, a_main, b_main, x_main) # Validăm datele de intrare
# Calculăm și scriem numerele cu toate cifrele egale
rezultate_main = numere_egale(T_main, a_main, b_main, x_main)
file_out.write(' '.join(map(str, rezultate_main)) + '\n')
except ValueError:
file_out.write("Datele de intrare nu corespund restrictiilor impuse")
except IndexError:
file_out.write("Datele de intrare nu corespund restrictiilor impuse")