1653 – Proporționale1

From Bitnami 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 invers proporţionale.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi cele n elemente ale şirului, separate prin spaţii.

Date de ieșire

Programul afișează pe ecran mesajul DA , dacă este posibilă rearanjarea elementelor celor două şiruri astfel încât acestea să fie invers proporţionale, respectiv NU în caz contrar.

Restricţii şi precizări

  • 1 ≤ n ≤ 100
  • elementele şirurilor vor avea cel mult 4 cifre

Exemplu

Intrare
4
2 8 4 1
4 2 8 16
Ieșire
DA

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

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
           return numar_elemente
       except ValueError:
           print("Numarul de elemente trebuie sa fie un numar intre 1 si 100.")

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
           return sir_1, sir_2
       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))

def verifica_proportionalitate(sir_1, sir_2):

   sir_1.sort()
   sir_2.sort()
   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__':

   numar_elemente = citeste_numar_elemente()
   sir_1, sir_2 = citeste_siruri(numar_elemente)
   if verifica_proportionalitate(sir_1, sir_2):
       print("DA")
   else:
       print("NU")
   print("Datele sunt introduse corect.")

</syntaxhighlight>

Rezolvare ver. 2

<syntaxhighlight lang="python" line>

  1. 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.")
  1. 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))
  1. Sortam cele doua siruri

sir_1.sort() sir_2.sort()

  1. 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
  1. Afisam rezultatul

if proportional:

   print("DA")

else:

   print("NU")

print("Datele sunt introduse corect.")

</syntaxhighlight>