3981 - DivImpRec: Difference between revisions

From Bitnami MediaWiki
Cata (talk | contribs)
No edit summary
Cata (talk | contribs)
No edit summary
 
Line 3: Line 3:


== Restricții și precizări ==
== Restricții și precizări ==
* 1 n 2.000.000.000
* 1 ⩽ n ⩽ 2.000.000.000
* Numele funcției este DivImpRec.
* Numele funcției este DivImpRec.
* Se recomandă utilizarea recursivității în rezolvarea problemei.
* Se recomandă utilizarea recursivității în rezolvarea problemei.
== Exemplu ==
DivImpRec(24) = 3.


== Explicație ==
==Date de intrare==
Funcția <code>DivImpRec</code> primește un număr natural <code>n</code> și întoarce cel mai mare divizor impar al lui <code>n</code>.
Programul citește de la tastatură numărul n.


Dacă <code>n</code> este impar, atunci funcția va întoarce <code>n</code>, altfel se va apela recursiv funcția cu argumentul <code>n // 2</code>.
==Date de ieșire==
 
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte.", apoi pe un rând nou valoarea returnată de funcția DivImpRec, reprezentând numărul cerut. În cazul în care numărul introdus depășește limitele date, se va afișa "Numarul introdus nu este valid.", iar dacă numărul introdus nu este întreg, se va afișa "Nu ati introdus un numar intreg."
Deoarece divizorii unui număr se împart în perechi (d, n//d), cel mai mare divizor impar al unui număr se poate obține prin împărțirea repetată a numărului la 2, până când se ajunge la un număr impar.


==Exemplu==
; Intrare
: Introduceți un număr întreg pozitiv între 1 și 2.000.000.000: 24
; Ieșire
: Datele introduse sunt valide.
: Cel mai mic divizor impar al numărului 24 este: 3
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
Line 32: Line 35:




def main():
if __name__ == "__main__":
     n = input("Introduceți un număr întreg pozitiv între 1 și 2.000.000.000: ")
     n = input("Introduceți un număr întreg pozitiv între 1 și 2.000.000.000: ")
     try:
     try:
Line 38: Line 41:
         if validate_n(n):
         if validate_n(n):
             result = DivImpRec(n)
             result = DivImpRec(n)
            print("Datele introduse sunt corecte.")
             print(f"Cel mai mic divizor impar al numărului {n} este: {result}")
             print(f"Cel mai mic divizor impar al numărului {n} este: {result}")
         else:
         else:
             print("Numărul introdus nu este valid.")
             print("Numărul introdus nu este valid.")
     except ValueError:
     except ValueError:
         print("Nu ați introdus un număr întreg pozitiv.")
         print("Nu ați introdus un număr întreg.")
</syntaxhighlight>


</syntaxhighlight>
==Explicație==
Funcția `validate_n(n)` verifică dacă numărul `n` este un număr întreg între 1 și 2.000.000.000, iar dacă această condiție este îndeplinită, returnează `True`, altfel `False`.
 
Funcția `DivImpRec(n)` primește un număr întreg `n` și încearcă să găsească cel mai mic divizor impar al lui `n`. Dacă `n` este impar, atunci el este cel mai mic divizor impar și funcția returnează `n`. Dacă `n` este par, atunci îl împarte la 2 și apelează recursiv aceeași funcție cu noul număr.
 
În `if __name__ == "__main__":` se cere utilizatorului să introducă un număr întreg pozitiv între 1 și 2.000.000.000, care este verificat dacă este valid. Apoi se apelează funcția `DivImpRec(n)` și se afișează cel mai mic divizor impar al numărului `n`, dacă acesta există.

Latest revision as of 15:01, 27 April 2023

Cerința[edit | edit source]

Scrieți funcția recursivă DivImpRec care primind ca parametru un număr natural nenul n, returnează cel mai mare divizor impar al său.

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

  • 1 ⩽ n ⩽ 2.000.000.000
  • Numele funcției este DivImpRec.
  • Se recomandă utilizarea recursivității în rezolvarea problemei.

Date de intrare[edit | edit source]

Programul citește de la tastatură numărul n.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte.", apoi pe un rând nou valoarea returnată de funcția DivImpRec, reprezentând numărul cerut. În cazul în care numărul introdus depășește limitele date, se va afișa "Numarul introdus nu este valid.", iar dacă numărul introdus nu este întreg, se va afișa "Nu ati introdus un numar intreg."

Exemplu[edit | edit source]

Intrare
Introduceți un număr întreg pozitiv între 1 și 2.000.000.000: 24
Ieșire
Datele introduse sunt valide.
Cel mai mic divizor impar al numărului 24 este: 3

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> def validate_n(n):

   if isinstance(n, int) and 1 <= n <= 2000000000:
       return True
   else:
       return False


def DivImpRec(n):

   if n % 2 == 1:
       return n
   else:
       return DivImpRec(n // 2)


if __name__ == "__main__":

   n = input("Introduceți un număr întreg pozitiv între 1 și 2.000.000.000: ")
   try:
       n = int(n)
       if validate_n(n):
           result = DivImpRec(n)
           print("Datele introduse sunt corecte.")
           print(f"Cel mai mic divizor impar al numărului {n} este: {result}")
       else:
           print("Numărul introdus nu este valid.")
   except ValueError:
       print("Nu ați introdus un număr întreg.")

</syntaxhighlight>

Explicație[edit | edit source]

Funcția `validate_n(n)` verifică dacă numărul `n` este un număr întreg între 1 și 2.000.000.000, iar dacă această condiție este îndeplinită, returnează `True`, altfel `False`.

Funcția `DivImpRec(n)` primește un număr întreg `n` și încearcă să găsească cel mai mic divizor impar al lui `n`. Dacă `n` este impar, atunci el este cel mai mic divizor impar și funcția returnează `n`. Dacă `n` este par, atunci îl împarte la 2 și apelează recursiv aceeași funcție cu noul număr.

În `if __name__ == "__main__":` se cere utilizatorului să introducă un număr întreg pozitiv între 1 și 2.000.000.000, care este verificat dacă este valid. Apoi se apelează funcția `DivImpRec(n)` și se afișează cel mai mic divizor impar al numărului `n`, dacă acesta există.