1984 - Cifra 2
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 < n ≤ 1000000
- 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>
- 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.