0623 - Numere 3

From Bitnami MediaWiki

Sursa: [1]

Enunt[edit | edit source]

Având o pasiune pentru numere, Răzvan a inventat un nou joc pentru două persoane. Regulile jocului sunt simple: se aleg trei numere naturale a, b şi c astfel încât a<b<c. La fiecare pas, primul jucător adună la a suma cifrelor lui a, iar cel de-al doilea jucător scade din c suma cifrelor lui c, la pasul următor fiind luate în considerare noile valori obţinute pentru a şi c. Jocul se termină când, la un anumit pas, a devine mai mare sau egal decât b, caz în care primul jucător este declarat câştigător, sau când c devine mai mic sau egal cu b, situaţie în care câştigă al doilea jucător. Dacă la un pas se îndeplinesc ambele codiţii, jocul se termină la egalitate.

Cerința[edit | edit source]

Cunoscând a, b şi c se cere:

a) Suma cifrelor celor trei numere. b) Valorile numerelor a şi c la fiecare pas al jocului, precum şi câştigătorul jocului.

Date de intrare[edit | edit source]

Fişierul de intrare numere3.in conţine pe prima linie un număr natural p. Pentru toate testele de intrare, numărul p poate avea doar valoarea 1 sau valoarea 2.

Pe a doua linie se găsesc cele trei numere naturale a, b şi c descrise în enunţ.

Date de ieșire[edit | edit source]

Dacă valoarea lui p este 1, se va rezolva numai punctul a) din cerință.

În acest caz, în fişierul de ieşire numere3.out se va scrie un singur număr natural s, reprezentând suma cifrelor lui a, b şi c.

Dacă valoarea lui p este 2, se va rezolva numai punctul b) din cerință.

În acest caz, fişierul de ieşire numere3.out va conține mai multe linii pe care se vor găsi câte două numere naturale separate printr-un spaţiu: valorile lui a şi c la fiecare pas al jocului. Pe ultima linie se va găsi 1, dacă primul jucător câştigă, 2 dacă cel de-al doilea jucător câştigă sau 0 dacă jocul se termină la egalitate.

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

0 < a < b < c < 10.000.000 Pentru rezolvarea corectă a primei cerinţe se acordă 20 de puncte, iar pentru cerința a doua se acordă 80 de puncte.

Exemplul 1:[edit | edit source]

numere3.in

1 25 51 75 numere3.out

25

Explicație[edit | edit source]

p = 1 2+5+5+1+7+5=25

Atenție! Pentru acest test se rezolvă doar cerința a)

Exemplul 2:[edit | edit source]

numere3.in

2 25 51 75 numere3.out

25 75 32 63 37 54 47 45 2

Explicație[edit | edit source]

p = 2

La cel de-al treilea pas, c devine mai mic decât b, jocul fiind câștigat de către al doilea jucător.

Atenție! Pentru acest test se rezolvă doar cerința b).

Exemplul 3:[edit | edit source]

numere3.in

2 25 46 75 numere3.out

25 75 32 63 37 54 47 45 0

Explicație[edit | edit source]

p = 2

La cel de-al treilea pas, a devine mai mare decât b, dar și c devine mai mic decât b. Astfel, jocul se termină la egalitate.

Atenție! Pentru acest test se rezolvă doar cerința b).

Încărcare soluție[edit | edit source]

<syntaxhighlight lang="python" line> def sum_of_digits(num):

   """
   Calculează suma cifrelor unui număr dat.
   """
   return sum(int(digit) for digit in str(num))
  1. Citirea datelor de intrare

p = int(input()) a, b, c = map(int, input().split())

if p == 1:

   # Rezolvarea cerinței a)
   print(sum_of_digits(a) + sum_of_digits(b) + sum_of_digits(c))

elif p == 2:

   # Rezolvarea cerinței b)
   winner = 0 # Câștigătorul jocului (0 - egalitate, 1 - primul jucător, 2 - al doilea jucător)
   while a < b and c > b:
       # Adună suma cifrelor lui a
       a += sum_of_digits(a)
       # Scade suma cifrelor lui c
       c -= sum_of_digits(c)
       print(a, c)
   if a >= b:
       winner = 1
   elif c <= b:
       winner = 2
   print(winner)

</syntaxhighlight>