Bacalaureat 2020 Subiectul III

  

    În această postare vom termina primul model propus de Ministerul Educației pentru Bacalaureatul la informatică. Toate explicațiile sunt scrise sub formă de comentariu în codul scris.

    Pont: de fiecare dată când vei scrie cod încearcă să îl explici înainte într-un comentariu sau la fiecare pas pe care îl faci. Astfel, corectorii vor putea înțelege ce scrii. 

    Important! Acest pont este valabil pentru orice proiect sau cod pe care îl vei scrie. În modul acesta o să-l înțelegi și tu, și posibilii parteneri sau coechipieri.

SUBIECTUL AL III-LEA (30 puncte)



void duplicare(long long int n, long long int &d) //antetul functiei
{
  long long int p, copie; 
  copie = n; // ii facem o copie lui n pentru a verifica la sfarsit daca variabilele d si n corespund
  p = 1; // initializam p, variabila necesara pentru construirea numarului cu numarul neutru inmultirii, 1
  d = 0;
  while(copie != 0) // prelucram copia lui n
  {
    if(copie%2 == 1) //daca numarul este impar se datoreaza ultimei cifre care este para
    {
      d = d + copie%10*p; // atasam o data cifra impara
      p *= 10;
      d = d + copie%10*p; // atasam a doua oara cifra impara
    }
    else
      d = d + copie%10*p; // daca ultima cifra este para o atasam numarului nou format 
    p *= 10;
    copie /= 10; // eliminam ultima cifra pe care am analizat-o
  }
  if(d == n) d = -1; // daca nu au fost modificari (nicio cifra nu s-a dublat), atunci este format numai din cifre pare
}




             #include  <iostream>
#include <cstring> // includem libraria pentru a lucra cu siruri de caractere
using namespace std;
int main()
{
              char prop[103], cop_prop[103], *poz; //declaram 2 siruri de caractere si un pointer
  unsigned int n;
  bool exista; //variabila ce poate lua valoarea 0 sau 1 prin care verificam daca fiecare multime ceruta este vida sau nu
  cin >> n;
  cin.get(); //sarim peste prima linie unde se afla valoarea lui n
  cin.getline(prop, 103); // citim propozitia data 
  strcpy(cop_prop, prop); // copiem propozitia in cop_prop
  exista = 0; // initializam variabila exista cu 0, presupunand ca multimea ceruta este vida
  poz = strtok(prop, " "); //cu ajutorul functiei strtok separam propozitia in cuvinte cu ajutorul caracterului spatiu
  while(poz != NULL) // cat timp pointerul nu este null
  {
    if(strlen(poz) >= n) 
    {
      cout << poz << '\n'; // afisam cuvintele care au lungime mai mare sau egala cu n
      exista = 1; //multimea ceruta nu este vida (exista cel putin un element)
    }
    poz = strtok(NULL, " "); // trecem la urmatorul cuvant 
  }
  if(exista == 0)   cout << "nu exista" << '\n'; // daca multimea este vida, adica variabila exista nu a fost modificata afisam "nu exista"
  // se reia algortimul dar pentru cuvintele care au lungimea mai mica strict decat n
  exista = 0;
  poz = strtok(cop_prop, " "); 
  while(poz != NULL)
  {
    if(strlen(poz) < n)
    {
      cout << poz << '\n';
      exista = 1;
    }
    poz = strtok(NULL, " ");
  }
  if(exista == 0)   cout << "nu exista" << '\n';
    return 0;
}




a.

    Am citit din fișierul numere.in numerele cu ajutorul a 3 variabile, n, x, y. n are semnificația din enunț, iar x și y memorează numerele de pe 2 poziții consecutive, la fiecare pas actualizându-le. Am verificat dacă între cele două numere există altele lipsă (dacă diferența dintre cele două este mai mare strict decât 1), și dacă existau adunam în variabila lipsa. La sfârșit am afișat valorile lipsă memorate în variabila lipsa.

   Algoritmul este eficient din punct de vedere al memoriei pentru că utilizează doar 4 variabile (nu se folosesc tablouri pentru stocarea tuturor elementelor).

   Algoritmul este eficient din punct de vedere al timpului, fiind liniar: O(n), unde n este numărul de elemente citite din fișier.


b.

             #include <iostream>
#include <fstream> // includem libraria fstream pentru a lucra cu fisiere
using namespace std;
ifstream fin("numere.in"); // comanda fin va fi pentru a citi din fisierul "numere.in"
int main()
{
  long long unsigned int n, x, y, lipsa;
  fin >> n >> x;
  lipsa = 0; //initializam variabila care va memora cate numere sunt lipsa cu 0
  if(x != n) // daca primul element din sir nu este n lipsesc n - x numere
    lipsa += (n - x);
  while(fin >> y)
  {
    if(x - y > 1) //daca 2 numere distincte de pe pozitii consecutive nu sunt consecutive
      lipsa += (x - y);
    x = y; //numarul deja citit va fi memorat in x pentru a citi urmatorul numar
    //comparam numerele 2 cate 2
  }
  cout << lipsa;
  return 0;
}






x
Acest website utilizează cookie-uri pentru a creea o experiență cât mai plăcută. Învață mai multe Acceptă