1984 - Cifra 2

From Bitnami MediaWiki
Revision as of 18:13, 19 April 2023 by Tamas Claudia (talk | contribs) (Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/1984/cifra2] ---- == Enunț == Cristian, elev în clasa a V-a, a primit o cutie cu ''numar'' bomboane. Chiar dacă i-ar plăcea, știe că nu este indicat să le mănânce pe toate imediat. L-a întrebat pe tatăl său câte bomboane are voie să mănânce și acesta i-a răspuns că poate mânca doar un număr sănătos de bomboane. Cristian a fost nedumerit. Tatăl i-a explicat că un număr sănătos este un număr natural care poate...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sursa: [1]


Enunț[edit | edit source]

Cristian, elev în clasa a V-a, a primit o cutie cu numar bomboane. Chiar dacă i-ar plăcea, știe că nu este indicat să le mănânce pe toate imediat. L-a întrebat pe tatăl său câte bomboane are voie să mănânce și acesta i-a răspuns că poate mânca doar un număr sănătos de bomboane. Cristian a fost nedumerit. Tatăl i-a explicat că un număr sănătos este un număr natural care poate fi modificat, până se obține o singură cifră, prin eliminarea celei mai mici cifre din el și înlocuirea fiecărei cifre rămase în număr cu diferența dintre valoarea ei și cifra minimă. De exemplu, cifra minimă a numărului 3151 este 1 iar prin eliminarea ei din număr se obține 35, după care prin înlocuirea cifrelor rămase se obține 24 adică cifra 3 se înlocuiește cu cifra 2, cifra 5 cu 4, rezultând numărul 24; se continuă procedeul: cifra minimă a numărului 24 este 2 iar prin eliminarea ei din număr se obține 4, după care prin înlocuirea cifrei rămase se obține 2 moment în care a rămas o singură cifră. Așadar numărul sănătos obținut din 3151 este 2. Ajutați-l pe Cristian să afle câte bomboane are voie să mănânce.

Cerinţa[edit | edit source]

Scrieţi un program care să citească numărul natural numar şi care să determine:

a. cifra minimă din numărul numar; (20% din punctaj)

b. numărul obținut după prima transformare a numărului numar; (30% din punctaj)

c. numărul sănătos obținut din numar. (50% din punctaj)

Date de intrare[edit | edit source]

Fișierul de intrare cifra2.in conține pe prima linie numărul natural numar.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi, fișierul de ieșire cifra2.out va conține cele trei valori cerute, fiecare pe câte un rând.. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."'.

Restricţii şi precizări[edit | edit source]

  • 10 < n1000000
  • Testele vor conține doar numere numar care pot fi modificate conform cerinței.

Exemple[edit | edit source]

Exemplul 1[edit | edit source]

cifra2.in
736191
Ecran
Datele sunt introduse corect.
cifra2.out
1
6258
2


Explicație[edit | edit source]

a. cifra minimă este 1

b. 736191 → 7369 → 6258

c. 6258 → 658 → 436, se continuă 436 → 46 → 13, se continuă 13 → 3 → 2.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 1984

def cifra_minima(numar):

   cifra_min = 9
   while numar > 0:
       cifra = numar % 10
       if cifra < cifra_min:
           cifra_min = cifra
       numar //= 10
   return cifra_min


def transformare_numar(numar):

   cifra_min = cifra_minima(numar)
   nou_numar = 0
   while numar > 0:
       cifra = numar % 10
       if cifra != cifra_min:
           noua_cifra = abs(cifra - cifra_min)
           nou_numar = noua_cifra * (10 ** len(str(nou_numar))) + nou_numar
       numar //= 10
   return nou_numar

def numar_sanatos(numar):

   while numar > 9:
       numar = transformare_numar(numar)
   return numar

def main():

   with open("cifra2.in") as f:
       numar = int(f.readline().strip())
   if numar <= 10 or numar > 1000000:
       print("Datele nu corespund restricțiilor impuse.")
       return
   numar_initial = numar
   while numar > 9:
       cifra_min = cifra_minima(numar)
       if cifra_min == 0:
           print("Datele nu corespund restricțiilor impuse.")
           return
       numar = transformare_numar(numar)
   with open("cifra2.out", "w") as f:
       f.write("Datele sunt introduse corect.\n")
       f.write(str(cifra_minima(numar_initial)) + "\n")
       f.write(str(transformare_numar(numar_initial)) + "\n")
       f.write(str(numar) + "\n")


if __name__ == '__main__':

   main()



</syntaxhighlight>

Explicație rezolvare[edit | edit source]

   Funcția "cifra_minima(numar)" determină cifra minimă a unui număr întreg pozitiv. În timp ce "transformare_numar(numar)" primește un număr întreg pozitiv și îl transformă într-un alt număr în care fiecare cifră diferă de cifra minimă a numărului inițial cu un anumit număr. Apoi, funcția "numar_sanatos(numar)" aplică funcția "transformare_numar" pe numărul dat repetat până când numărul ajunge să aibă o singură cifră. În cele din urmă, funcția "main" citeste un număr dintr-un fișier, verifică dacă respectă anumite restricții, apoi aplică funcțiile "cifra_minima" și "transformare_numar" și scrie rezultatele într-un fișier de ieșire.