1255 - Lipsa

From Bitnami MediaWiki

Sursa: [1]

Cerinţa

Se dau n - 1 numere naturale distincte de la 1 la n. Să se gaseasca numărul lipsă.

Date de intrare

Programul conține pe prima linie numărul n, iar pe a doua linie n - 1 numere naturale separate prin spații.

Date de ieșire

Programul va conține pe prima linie numărul căutat.

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează numărul lipsă .

În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

Restricţii şi precizări

2 ≤ n ≤ 1.000.000

Exemplul 1

Datele de intrare
Introdu un nr. N urmat de N numere:
5
5 3 1 2
Datele de ieșire
Datele sunt introduse corect.
4


Rezolvare

<syntaxhighlight lang="python" line>

  1. 1255

def calculate_missing_number(n, nums):

   sum_given = sum(nums)
   sum_n = (n * (n+1)) // 2
   missing_num = sum_n - sum_given
   return missing_num

def display_missing_number(missing_num):

   print(missing_num)

def validate_input(n, nums):

   if not isinstance(n, int):
       print("Datele nu corespund restricțiilor impuse.")
       return False
   elif len(nums) != n:
       print("Datele nu corespund restricțiilor impuse.")
       return False
   elif any(num < 1 or num > n for num in nums):
       print("Datele nu corespund restricțiilor impuse.")
       return False
   else:
       return True

if __name__ == '__main__':

   n = int(input("Introdu un nr. N urmat de N numere:"))
   nums = list(map(int, input().split()))
   if validate_input(n, nums):
       missing_num = calculate_missing_number(n, nums)
       display_missing_number(missing_num)
       print("Datele sunt introduse corect")



</syntaxhighlight> Explicatie cod:

Acest cod rezolvă problema găsirii unui număr lipsă într-o secvență de numere de la 1 la N.

Funcția `calculate_missing_number` primește două argumente, `n` și `nums`, unde `n` este un întreg care reprezintă lungimea secvenței și `nums` este o listă de întregi care reprezintă secvența. Funcția calculează suma secvenței apelând `sum(nums)` și calculează suma secvenței de la 1 la `n` utilizând formula `(n * (n+1)) // 2`. Numărul lipsă este apoi calculat prin scăderea sumei secvenței date din suma secvenței de la 1 la `n`. Numărul lipsă este returnat de funcție.

Funcția `display_missing_number` primește un singur argument, `missing_num`, care reprezintă numărul lipsă calculat de funcția `calculate_missing_number`. Funcția afișează numărul lipsă.

Funcția `validate_input` primește doi argumente, `n` și `nums`, și verifică dacă introducerea este validă. Funcția returnează `False` dacă introducerea nu respectă restricțiile necesare și returnează `True` în caz contrar. Restricțiile sunt că `n` trebuie să fie un întreg, `nums` trebuie să fie o listă de lungime `n`, iar toate numerele din listă trebuie să fie între 1 și `n`.

În blocul principal, utilizatorul este invitat să introducă `n` și `nums`. Introducerea este validată apelând funcția `validate_input`. Dacă introducerea este validă, numărul lipsă este calculat prin apelarea funcției `calculate_missing_number` și afișat prin apelarea funcției `display_missing_number`. Dacă introducerea este invalidă, se afișează un mesaj de eroare. Dacă introducerea este validă, se afișează un mesaj de succes.