3677 - Cifre Vecine: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/3677/cifrevecine] ---- == 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 nunărul k. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: '''...
 
No edit summary
Line 4: Line 4:
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).
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 ==
== Date de intrare ==
Fișierul de intrare va conține pe prima linie numărul n și pe a doua linie nunărul k.
Fișierul de intrare va conține pe prima linie numărul '''n''' și pe a doua linie nunărul '''k'''.
== Date de ieșire ==  
== 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ă.
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ă.

Revision as of 18:43, 26 April 2023

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

<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

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.