1767 - Multiple

From Bitnami MediaWiki
Revision as of 09:10, 22 April 2023 by Paul Ungur (talk | contribs) (Pagină nouă: Sergiu, fiind un elev talentat în ceea ce priveşte informatica, doreşte pe cât posibil să-şi ajute prietenii în rezolvarea problemelor. Prietenii lui au venit la el, fiind foarte confuzi în legătură cu o anumită problemă: Ei au un set de <span style=“color: red”> T</span> întrebări de forma: Care este cel mai mic număr strict mai mare decât <span style=“color: red”> n</span>, divizibil cu <span style=“color: red”> k</span>? Fiind ocupat cu pregăti...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Sergiu, fiind un elev talentat în ceea ce priveşte informatica, doreşte pe cât posibil să-şi ajute prietenii în rezolvarea problemelor. Prietenii lui au venit la el, fiind foarte confuzi în legătură cu o anumită problemă: Ei au un set de T întrebări de forma: Care este cel mai mic număr strict mai mare decât n, divizibil cu k? Fiind ocupat cu pregătirea pentru OJI, el vă roagă pe voi să-l ajutaţi!

Cerința

Pentru fiecare din cele T întrebări, să se afle cel mai mic număr strict mai mare decât n care este divizibil cu k.

Date de intrare

Fișierul de intrare multiple.in conține pe prima linie numărul T, iar următoarele T linii conţin câte două numere, n şi k, cu semnificaţia din enunţ.

Date de ieșire

Fișierul de ieșire multiple.out va conține pe T linii, pentru fiecare întrebare, numărul cerut.

Restricții și precizări

1 ≤ T ≤ 10000 se recomandă utilizarea tipurilor de date pe 8 octeţi (64 de biţi) dacă reuşiţi să-l ajutaţi pe Sergiu, pe lângă cele 100 de puncte, probabil el vă va face cinste şi cu o sticlă de apă minerală

Exemplu:

multiple.in 5 1 2 3 7 24 9 13 223 45 9

multiple.out 2 7 27 223 54

Rezolvare

<syntaxhighlight lang="python" line>

  1. include <iostream>
  2. include <fstream>

using namespace std;

// functie de validare pentru n si k bool valid(int n, int k) {

   return (n >= 1 && n <= 1e18 && k >= 1 && k <= 1e9);

}

int main() {

   int T;
   ifstream fin("multiple.in");
   ofstream fout("multiple.out");
   fin >> T;
   for (int i = 0; i < T; i++) {
       long long n, k; // folosim long long pentru a stoca numerele mari
       fin >> n >> k;
       // verificam daca n si k sunt valide, altfel afisam -1 si continuam cu urmatoarea iteratie
       if (!valid(n, k)) {
           fout << "-1\n";
           continue;
       }
       // calculam cel mai mic multiplu al lui k care este mai mare decat n
       long long multiple = (n / k + 1) * k;
       fout << multiple << "\n";
   }
   fin.close();
   fout.close();
   return 0;

} </syntaxhighlight>

Explicatie

Pentru a rezolva problema, vom folosi o buclă for pentru a parcurge cele T întrebări. Pentru fiecare întrebare, citim valorile n și k din fișierul de intrare, apoi verificăm dacă valorile sunt valide folosind funcția de validare valid().

Dacă valorile nu sunt valide, afișăm -1 și continuăm cu următoarea iteratie a buclei for. Dacă valorile sunt valide, calculăm cel mai mic multiplu al lui k care este mai mare decât n. Aceasta poate fi calculat prin împărțirea lui n la k, adăugarea valorii 1 și apoi înmulțirea cu k.

La final, afișăm rezultatele pentru fiecare întrebare în fișierul de ieșire și închidem fișierele de intrare și de ieșire.