3677 - Cifre Vecine

De la Universitas MediaWiki

Sursa: [1]


Cerinţa

Se dau două numere naturale n și k. Determinați cea mai mare valoare care se poate obține eliminând din numărul n exact k cifre aflate pe poziții alăturate(una după alta).

Date de intrare

Fișierul de intrare va conține pe prima linie numărul n și pe a doua linie numărul k.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi în fișierul de ieșire se va scrie pe prima linie valoarea cerută. În caz contrar, pe ecran se va afișa: "Datele nu au fost introduse corect."

Restricţii şi precizări

  • n este un număr cuprins între 10 și inclusiv.
  • 1 ≤ k < numărul de cifre ale lui n.
  • pentru 50 de puncte k este 1.

Exemple

Exemplul 1

cifrevecine.in
10002
3
Ecran
Datele sunt introduse corect.
cifrevecine.out
12

Exemplul 2

cifrevecine.in
1938
2
Ecran
Datele sunt introduse corect.
cifrevecine.out
38

Rezolvare

# 3677

def verificare_date_intrare(n: int, k: int) -> bool:
    if not(10 <= n <= 10**17 and 1 <= k < len(str(n))):
        print("Datele nu au fost introduse corect.")
        return False
    print("Datele sunt introduse corect.")
    return True


def rezolva_problema(n: int, k: int) -> int:
    n_str = str(n)
    max_val = 0
    for i in range(len(n_str)-k):
        val = int(n_str[:i] + n_str[i+k:])
        if val > max_val:
            max_val = val
    return max_val


if __name__ == "__main__":
    with open("cifrevecine.in") as f:
        n = int(f.readline().strip())
        k = int(f.readline().strip())
    if not verificare_date_intrare(n, k):
        return
    with open("cifrevecine.out", "w") as f:
        f.write(str(rezolva_problema(n, k)))

Explicație rezolvare

Funcția verificare_date_intrare primește două argumente întregi, n și k, și returnează True dacă datele introduse sunt corecte și False altfel. Verificarea se face astfel: dacă n nu este cuprins între 10 și inclusiv sau k nu este cuprins între 1 și numărul de cifre ale lui n (calculat cu len(str(n))), atunci afișează un mesaj de eroare și returnează False. În caz contrar, afișează un mesaj de confirmare și returnează True.

Funcția rezolva_problema primește două argumente întregi, n și k, și returnează o valoare întreagă, cea mai mare valoare care se poate obține eliminând din numărul n exact k cifre aflate pe poziții alăturate (una după alta). Mai întâi, n este convertit într-un șir de caractere n_str. Apoi, se inițializează max_val cu 0 și se parcurg toate subșirurile de lungime len(n_str) - k ale lui n_str. Pentru fiecare subșir n_str[:i] + n_str[i+k:], se elimină cifrele aflate pe poziții alăturate și se obține un nou număr, val. Dacă val este mai mare decât max_val, se actualizează max_val cu val. La final, se returnează max_val.

În blocul principal if __name__ == "__main__":, se deschide fișierul de intrare "cifrevecine.in", se citesc valorile lui n și k, și se verifică dacă datele sunt corecte cu ajutorul funcției verificare_date_intrare. Dacă datele nu sunt corecte, programul se oprește. În caz contrar, se deschide fișierul de ieșire "cifrevecine.out" și se scrie valoarea returnată de funcția rezolva_problema în fișier.