4261 - Altern Div Imp: Difference between revisions

From Bitnami MediaWiki
Cristina94 (talk | contribs)
Pagină nouă: ==Cerința== Folosind metoda Divide et Impera, scrieți funcția recursivă cu antetul <syntaxhighlight lang="python" line> int AlternDivImp(int a[], int st, int dr) </syntaxhighlight> care primind ca parametri un vector a de numere naturale și două numere întregi st și dr, returnează 1 dacă în secvența a[st], a[st+1], ..., a[dr] numerele impare alternează cu cele pare, sau returnează 0 dacă există cel puțin două numere alăturate de aceeași paritate. ==Rest...
 
Cristina94 (talk | contribs)
mNo edit summary
 
(One intermediate revision by the same user not shown)
Line 15: Line 15:


==Exemplu==
==Exemplu==
Dacă a = (1,2,3,4,5,6,7,8,9,11), atunci AlternDivImp(a, 1, 10) = 0, deoarece numerele 9 și 11 aflate pe poziții alăturate au aceeași paritate. De asemenea, AlternDivImp(a, 1, 8) = 1.
Dacă a = (1,2,3,4,5,6,7,8,9,11), atunci AlternDivImp(a, 1, 10) = 0, deoarece numerele 9 și 11 aflate pe poziții alăturate au aceeași paritate. Programul va afișa: "Există cel puțin două numere alăturate de aceeași paritate!". De asemenea, AlternDivImp(a, 1, 8) = 1. Programul va afișa: "Secvența este alternantă!".
 
Dacă a = (1,2,3,4,5,6,7,8,9,-1), atunci programul va afișa: "Datele introduse nu respectă restricțiile!".


==Important==
==Important==
Line 23: Line 25:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#4261 AlternDivImp
#4261 AlternDivImp
def verifica_restrictii(a, st, dr):
    if st > dr:
        return False
    if st < 0 or dr >= len(a):
        return False
    for elem in a[st:dr+1]:
        if elem < 0:
            return False
    return True
def citeste_date():
    input_str = input("Introduceți elementele vectorului separate prin virgulă: ")
    elemente = input_str.split(',')
    a = [int(elem) for elem in elemente]
    return a
def AlternDivImp(a, st, dr):
def AlternDivImp(a, st, dr):
     if st == dr:
     if st == dr:
Line 43: Line 61:


def main():
def main():
     # Exemplu de date de intrare
     # Citim datele de la tastatură
     a = [1, 2, 3, 4, 5, 6, 7, 8]
     a = citeste_date()
     st = 0
     st = 0
     dr = len(a) - 1
     dr = len(a) - 1
    # Verificăm restricțiile
    if not verifica_restrictii(a, st, dr):
        print("Datele introduse nu respectă restricțiile!")
        return


     # Apelăm funcția și afișăm rezultatul
     # Apelăm funcția și afișăm rezultatul
     rezultat = AlternDivImp(a, st, dr)
     rezultat = AlternDivImp(a, st, dr)
     print(rezultat)
     if rezultat:
        print("Secvența este alternantă!")
    else:
        print("Există cel puțin două numere alăturate de aceeași paritate!")


if __name__ == "__main__":
if __name__ == "__main__":
     main()
     main()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 18:08, 9 February 2024

Cerința[edit | edit source]

Folosind metoda Divide et Impera, scrieți funcția recursivă cu antetul

<syntaxhighlight lang="python" line> int AlternDivImp(int a[], int st, int dr) </syntaxhighlight>

care primind ca parametri un vector a de numere naturale și două numere întregi st și dr, returnează 1 dacă în secvența a[st], a[st+1], ..., a[dr] numerele impare alternează cu cele pare, sau returnează 0 dacă există cel puțin două numere alăturate de aceeași paritate.

Restricții și precizări[edit | edit source]

  • st ≤ dr
  • Numele funcției este AlternDivImp.
  • Vectorul a este indexat de la 1
  • Se recomandă utilizarea metodei Divide et Impera în rezolvarea problemei.

Exemplu[edit | edit source]

Dacă a = (1,2,3,4,5,6,7,8,9,11), atunci AlternDivImp(a, 1, 10) = 0, deoarece numerele 9 și 11 aflate pe poziții alăturate au aceeași paritate. Programul va afișa: "Există cel puțin două numere alăturate de aceeași paritate!". De asemenea, AlternDivImp(a, 1, 8) = 1. Programul va afișa: "Secvența este alternantă!".

Dacă a = (1,2,3,4,5,6,7,8,9,-1), atunci programul va afișa: "Datele introduse nu respectă restricțiile!".

Important[edit | edit source]

Soluția propusă va conține doar funcția cerută. Introducerea în soluție a altor instrucțiuni poate duce la erori de compilare sau de execuție, care vor duce la depunctarea soluției.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 4261 AlternDivImp

def verifica_restrictii(a, st, dr):

   if st > dr:
       return False
   if st < 0 or dr >= len(a):
       return False
   for elem in a[st:dr+1]:
       if elem < 0:
           return False
   return True

def citeste_date():

   input_str = input("Introduceți elementele vectorului separate prin virgulă: ")
   elemente = input_str.split(',')
   a = [int(elem) for elem in elemente]
   return a

def AlternDivImp(a, st, dr):

   if st == dr:
       return 1  # Secvența de lungime 1 este alternantă
   mijloc = (st + dr) // 2
   # Verificăm dacă secvența este alternantă în prima jumătate
   alternanta_stanga = AlternDivImp(a, st, mijloc)
   # Verificăm dacă secvența este alternantă în a doua jumătate
   alternanta_dreapta = AlternDivImp(a, mijloc + 1, dr)
   # Verificăm dacă ultimul element din prima jumătate și primul element din a doua jumătate au aceeași paritate
   if a[mijloc] % 2 == a[mijloc + 1] % 2:
       return 0  # Două numere consecutive au aceeași paritate
   # Secvența este alternantă doar dacă ambele jumătăți sunt alternante
   return alternanta_stanga and alternanta_dreapta

def main():

   # Citim datele de la tastatură
   a = citeste_date()
   st = 0
   dr = len(a) - 1
   # Verificăm restricțiile
   if not verifica_restrictii(a, st, dr):
       print("Datele introduse nu respectă restricțiile!")
       return
   # Apelăm funcția și afișăm rezultatul
   rezultat = AlternDivImp(a, st, dr)
   if rezultat:
       print("Secvența este alternantă!")
   else:
       print("Există cel puțin două numere alăturate de aceeași paritate!")

if __name__ == "__main__":

   main()

</syntaxhighlight>