0296 – Proporționale
De la Universitas MediaWiki
Sursa: [1]
Cerinţa
Se dau două şiruri cu câte n elemente, numere naturale nenule. Să se verifice dacă este posibilă rearanjarea elementelor celor două şiruri astfel încât acestea să fie direct proporţionale.
Date de intrare
Programul afișează pe ecran mesajul DA, dacă este posibilă rearanjarea elementelor celor două şiruri astfel încât acestea să fie direct proporţionale, respectiv NU în caz contrar.
Date de ieșire
Programul va afişa pe ecran numărul de cifre ale numărului citit.
Restricţii şi precizări
- 1 ≤ n ≤ 100
- elementele şirurilor vor avea cel mult 4 cifre
- se recomandă evitarea lucrului cu numere reale
Exemplu
- Intrare
- 6
- 10 10 15 30 25 15
- 6 9 9 6 15 18
- Ieșire
- DA
Explicaţie
Numerele (10 10 15 30 25 15) şi (6 6 9 18 15 9) sunt proporţionale. Raportul este 5/3.
Rezolvare
Rezolvare ver. 1
def citeste_numar_elemente():
while True:
try:
numar_elemente = int(input("Introduceti numarul de elemente (maxim 100): "))
if numar_elemente < 1 or numar_elemente > 100:
raise ValueError
break
except ValueError:
print("Numarul de elemente trebuie sa fie un numar intre 1 si 100.")
return numar_elemente
def citeste_siruri(numar_elemente):
while True:
try:
sir_1 = list(map(int, input("Introduceti elementele primului sir, separate prin spatiu: ").split()))
sir_2 = list(map(int, input("Introduceti elementele celui de-al doilea sir, separate prin spatiu: ").split()))
if len(sir_1) != numar_elemente or len(sir_2) != numar_elemente:
raise ValueError
for i in range(numar_elemente):
if sir_1[i] < 1 or sir_1[i] > 9999 or sir_2[i] < 1 or sir_2[i] > 9999:
raise ValueError
break
except ValueError:
print("Elementele trebuie sa fie numere naturale nenule cu cel mult 4 cifre si sa fie exact {} elemente in fiecare sir.".format(numar_elemente))
return sir_1, sir_2
def sorteaza_siruri(sir_1, sir_2):
sir_1.sort()
sir_2.sort()
def verifica_proportionalitate(sir_1, sir_2, numar_elemente):
for i in range(numar_elemente):
if sir_1[i] * sir_2[numar_elemente-1-i] != sir_1[numar_elemente-1-i] * sir_2[i]:
return False
return True
if __name__ == '__main__':
# Citim numarul de elemente
numar_elemente = citeste_numar_elemente()
# Citim cele doua siruri
sir_1, sir_2 = citeste_siruri(numar_elemente)
# Sortam cele doua siruri
sorteaza_siruri(sir_1, sir_2)
# Verificam daca sirurile sunt proportionale
proportional = verifica_proportionalitate(sir_1, sir_2, numar_elemente)
# Afisam rezultatul
if proportional:
print("DA")
else:
print("NU")
print("Datele sunt introduse corect.")
Reolvare ver. 2
# Citim numarul de elemente din siruri si validam datele de intrare
while True:
try:
numar_elemente = int(input("Introduceti numarul de elemente (maxim 100): "))
if numar_elemente < 1 or numar_elemente > 100:
raise ValueError
break
except ValueError:
print("Numarul de elemente trebuie sa fie un numar intre 1 si 100.")
# Citim cele doua siruri si validam datele de intrare
while True:
try:
sir_1 = list(map(int, input("Introduceti elementele primului sir, separate prin spatiu: ").split()))
sir_2 = list(map(int, input("Introduceti elementele celui de-al doilea sir, separate prin spatiu: ").split()))
if len(sir_1) != numar_elemente or len(sir_2) != numar_elemente:
raise ValueError
for i in range(numar_elemente):
if sir_1[i] < 1 or sir_1[i] > 9999 or sir_2[i] < 1 or sir_2[i] > 9999:
raise ValueError
break
except ValueError:
print("Elementele trebuie sa fie numere naturale nenule cu cel mult 4 cifre si sa fie exact {} elemente in fiecare sir.".format(numar_elemente))
# Sortam cele doua siruri
sir_1.sort()
sir_2.sort()
# Verificam daca sirurile sunt proportionale
proportional = True
for i in range(numar_elemente):
if sir_1[i] * sir_2[numar_elemente-1-i] != sir_1[numar_elemente-1-i] * sir_2[i]:
proportional = False
break
# Afisam rezultatul
if proportional:
print("DA")
else:
print("NU")
print("Datele sunt introduse corect.")