0425 - Viete: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: ==Cerință== Se consideră ecuația de gradul al doilea '''ax^2+bx+c'''=0 cu coeficienți întregi și un număr natural n. Să se determine '''Sn=xn1+xn2''' unde '''x1''' și '''x2''' sunt rădăcinile ecuației, folosind relațiile lui Viete. ==Date de intrare== Programul citește de la tastatură numerele '''a b c n'''. ==Date de ieșire== Programul afișează pe ecran numărul S, reprezentând valoarea cerută. ==Restricții de precizări== *'''1 ≤ n ≤ 10''' *...
 
No edit summary
Line 33: Line 33:
Pentru rezolvarea problemei folosim relațiile de mai sus.
Pentru rezolvarea problemei folosim relațiile de mai sus.


==Exemplu:==
==Exemplul 1:==
 
;Intrare
;Intrare
:1 -3 2 4
:1 -3 2 4
;Ieșire
;Ieșire
:Datele de intrare corespund restrictiilor impuse.
:17
:17


==Exemplul 2:==
;Intrare
:5 20 20 4
;Ieșire
:Datele de intrare nu corespund restrictiilor impuse.


==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line="1" start="1">
<syntaxhighlight lang="python" line="1" start="1">
def solve(a, b, c, n):
    # Calculăm S și P folosind relațiile lui Viete
    S = -b/a
    P = c/a


    # Dacă n este 1, returnăm S
def verificare_restrictii(nr_a, nr_b, nr_c, nr_n):    # functia de verificare a datelor de intrare
     if n == 1:
     if nr_a == 1 and -10 <= nr_b <= 10 and -10 <= nr_c <= 10 and 1 <= nr_n <= 10:
        return int(S)
         return True
    # Dacă n este 2, calculăm și returnăm S^2 - 2*P
    elif n == 2:
         return int(S**2 - 2*P)
     else:
     else:
         # Pentru n mai mare decât 2, folosim formula recursivă pentru a calcula Sn
         return False
         Sn_minus_1 = S**2 - 2*P
 
         Sn_minus_2 = S
 
         for _ in range(3, n+1):
def solve(nr_a, nr_b, nr_c, nr_n):
             Sn = S*Sn_minus_1 - P*Sn_minus_2
    global sn
             Sn_minus_2 = Sn_minus_1
    s = -nr_b/nr_a
             Sn_minus_1 = Sn
    p = nr_c/nr_a
         return int(Sn)
 
    if nr_n == 1:
        return int(s)
    elif nr_n == 2:
        return int(s**2 - 2*p)
    else:
         sn_minus_1 = s**2 - 2*p
         sn_minus_2 = s
         for _ in range(3, nr_n+1):
             sn = s*sn_minus_1 - p*sn_minus_2
             sn_minus_2 = sn_minus_1
             sn_minus_1 = sn
         return int(sn)  # Adăugăm această linie pentru a returna sn
 
 
if __name__ == '__main__':
    try:
        a = int(input("Introduceti numarul a: "))
        b = int(input("Introduceti numarul b: "))
        c = int(input("Introduceti numarul c: "))
        n = int(input("Introduceti numarul n: "))
 
        if verificare_restrictii(a, b, c, n):
            print("Datele de intrare corespund restrictiilor impuse.")
            print(solve(a, b, c, n))
        else:
            print("Datele de intrare nu corespund restrictiilor impuse.")
    except ValueError:
        print("Datele de intrare nu corespund restrictiilor impuse.")


# Citim numerele a, b, c, n de la tastatură
a, b, c, n = map(int, input().split())
# Apelăm funcția solve și afișăm rezultatul
print(solve(a, b, c, n))
</syntaxhighlight>
</syntaxhighlight>



Revision as of 15:53, 11 November 2023

Cerință

Se consideră ecuația de gradul al doilea ax^2+bx+c=0 cu coeficienți întregi și un număr natural n. Să se determine Sn=xn1+xn2 unde x1 și x2 sunt rădăcinile ecuației, folosind relațiile lui Viete.

Date de intrare

Programul citește de la tastatură numerele a b c n.

Date de ieșire

Programul afișează pe ecran numărul S, reprezentând valoarea cerută.

Restricții de precizări

  • 1 ≤ n ≤ 10
  • -10 ≤ b,c ≤ 10, a = 1
  • rezultatul se va înscrie pe 32 de biți cu semn

Indicații de rezolvare

Considerăm relațiile lui Viete

S=x1+x2=−ba

P=x1⋅x2=ca Se demonstrează că:

Sn=S⋅Sn−1−P⋅Sn−2

S1=S

S2=S2−2⋅P Pentru rezolvarea problemei folosim relațiile de mai sus.

Exemplul 1:

Intrare
1 -3 2 4
Ieșire
Datele de intrare corespund restrictiilor impuse.
17

Exemplul 2:

Intrare
5 20 20 4
Ieșire
Datele de intrare nu corespund restrictiilor impuse.

Rezolvare

<syntaxhighlight lang="python" line="1" start="1">

def verificare_restrictii(nr_a, nr_b, nr_c, nr_n): # functia de verificare a datelor de intrare

   if nr_a == 1 and -10 <= nr_b <= 10 and -10 <= nr_c <= 10 and 1 <= nr_n <= 10:
       return True
   else:
       return False


def solve(nr_a, nr_b, nr_c, nr_n):

   global sn
   s = -nr_b/nr_a
   p = nr_c/nr_a
   if nr_n == 1:
       return int(s)
   elif nr_n == 2:
       return int(s**2 - 2*p)
   else:
       sn_minus_1 = s**2 - 2*p
       sn_minus_2 = s
       for _ in range(3, nr_n+1):
           sn = s*sn_minus_1 - p*sn_minus_2
           sn_minus_2 = sn_minus_1
           sn_minus_1 = sn
       return int(sn)  # Adăugăm această linie pentru a returna sn


if __name__ == '__main__':

   try:
       a = int(input("Introduceti numarul a: "))
       b = int(input("Introduceti numarul b: "))
       c = int(input("Introduceti numarul c: "))
       n = int(input("Introduceti numarul n: "))
       if verificare_restrictii(a, b, c, n):
           print("Datele de intrare corespund restrictiilor impuse.")
           print(solve(a, b, c, n))
       else:
           print("Datele de intrare nu corespund restrictiilor impuse.")
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse.")

</syntaxhighlight>


Explicație

S=3,P=2 S1=S=3 S2=S2−2⋅P=32−2⋅2=5 S3=S⋅S2−P⋅S1=3⋅5−2⋅3=9 S4=S⋅S3−P⋅S2=3⋅9−2⋅5=17