3677 - Cifre Vecine
Sursa: [1]
Cerinţa[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 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[edit | edit source]
Exemplul 1[edit | edit source]
- cifrevecine.in
- 10002
- 3
- Ecran
- Datele sunt introduse corect.
- cifrevecine.out
- 12
Exemplul 2[edit | edit source]
- cifrevecine.in
- 1938
- 2
- Ecran
- Datele sunt introduse corect.
- cifrevecine.out
- 38
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 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)))
</syntaxhighlight>
Explicație rezolvare[edit | edit source]
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.