1984 - Cifra 2

De la Universitas MediaWiki

Sursa: [1]


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 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

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

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

Date de ieșire

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

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

Exemple

Exemplul 1

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


Explicație

a. cifra minimă este 1

b. 736191 → 7369 → 6258

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

Rezolvare

# 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()

Explicație rezolvare

   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.