3383 - Cif Max Min1

From Bitnami MediaWiki

Sursa: [1]

Cerinţa

Fie un număr n natural nenul, determinați un număr k și o combinație de semne + sau - (mai exact o succesiune x1,x2,…,xk unde xi∈{−1,1}, astfel încat să aibă loc relația: n=x1⋅ 1^2+ x2 ⋅ 2^2 + … + xk ⋅ k^2. Să se afișeze o succesiune de k semne + sau - care să îndeplinească relația de mai sus.

Date de intrare

Scrieți un program care determină și afișează patru numere, în această ordine: numărul obținut de Petrică, câte cartonașe a extras Petrică, numărul obținut de Ionuț și câte cartonașe a extras Ionuț.

Date de ieșire

Programul va afișa pe ecran, mesajul "Datele introduse corespund cerințelor" și pe o linie nouă programul va afișa pe ecran o succesiune de k semne + sau - care să îndeplinească relația. În caz contrar programul va afișa pe o linie noua mesajul "Datele introduse nu corespund cerintelor."

Restricţii şi precizări

  • 1 ⩽ n ⩽ 100

Exemplul 1

Intrare
3
Ieșire
-+--+


Exemplul 2

Intrare
2
Ieșire
---+


Rezolvare

<syntaxhighlight lang="python" line>

  1. 3383

def calc_min_max(x):

   cmin = 10
   cmax = 0
   while x:
       if x % 10 > cmax:
           cmax = x % 10
       if x % 10 < cmin:
           cmin = x % 10
       x //= 10
   return cmin, cmax


def validate_input(n, nums):

   if not (1 < n <= 1000):
       return False
   for num in nums:
       if not (10 <= num <= 999999999) or '0' in str(num) or len(set(str(num))) != len(str(num)):
           return False
   if all(num % 2 == 0 for num in nums) or all(num % 2 == 1 for num in nums):
       return False
   return True


def main():

   with open("cifmaxmin.in") as fin, open("cifmaxmin.out", "w") as fout:
       n = int(fin.readline().strip())
       nums = []
       for i in range(n):
           x = int(fin.readline().strip())
           nums.append(x)
       if not validate_input(n, nums):
           fout.write("Datele introduse nu corespund cerintelor.")
           return
       print("Datele introduse corespund cerintelor.")
       maxi = 1
       mini = 100
       c1 = c2 = 0
       for num in nums:
           if num % 2 == 0:
               c1 += 1
               cmin, cmax = calc_min_max(num)
               nr = cmax * 10 + cmin
               if nr > maxi:
                   maxi = nr
           else:
               c2 += 1
               cmin, cmax = calc_min_max(num)
               nr = cmin * 10 + cmax
               if nr < mini:
                   mini = nr
       fout.write(f"{maxi} {c1} {mini} {c2}")


main()

</syntaxhighlight>

Explicatie rezolvare