3677 - Cifre Vecine

From Bitnami MediaWiki

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>

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