Sari la conținut
EduCamp

Probleme rezolvate pe categorii

Numere și cifre

23 probleme Date la Definitivat și Titularizare între 2016 și 2023. Exerciții: 16

Înainte de probleme Tiparul problemelor cu cifrele unui număr

Problemele cu cifrele unui număr s-au dat la examenul de Definitivat în fiecare an, între 2016 și 2023, cu excepția anului 2018. Toate au aceeași formă:

  • un subprogram care lucrează pe cifrele unui singur număr: suma cifrelor, cifra minimă și cifra maximă, numărul de apariții ale unei cifre, mutarea ultimei cifre în față;
  • un program care citește un șir de numere, de obicei dintr-un fișier, apelează subprogramul pentru fiecare număr și determină un minim, un maxim sau un număr de termeni.
AnulCe face subprogramulCe face programul
2016returnează suma cifrelorgăsește cele mai mari două numere echilibrate
2017furnizează cifra minimă și cifra maximănumără termenii cu două cifre consecutive
2019returnează numărul de apariții ale unei cifreconstruiește cel mai mic și cel mai mare număr din cifrele date
2020returnează cifra maximănumără, pentru fiecare bază, numerele care pot fi scrise în ea
2021furnizează numărul de cifre distincte și cifra maximăcaută cel mai mic număr scris cu cifrele 0, 1 și 2
2022mută ultima cifră în fața celorlaltecaută cel mai mic număr impar și îl numără
2023returnează suma cifrelordetermină cea mai mică cifră de control

Cele trei prelucrări de bază

Extragerea cifrelor. Ultima cifră a lui n este n % 10, iar n / 10 este numărul fără ultima cifră. Cifrele se obțin de la dreapta la stânga, într-o structură repetitivă care se oprește când n devine 0.

nn % 10n / 10
34255342
342234
3443
330

Construirea unui număr din cifre. O cifră c se adaugă la dreapta numărului r prin r = r * 10 + c. O cifră c se adaugă la stânga lui r prin r = c * p + r, unde p este 10 la puterea numărului de cifre ale lui r.

Numărul oglindit. Cifrele lui n, luate de la dreapta, se adaugă la dreapta lui r. Pentru n = 3425, r trece prin valorile 5, 52, 524, 5243.

Programul-șablon

Programul de mai jos are cele trei prelucrări, fiecare într-un subprogram. Ca exemplu, se citește un număr și se afișează suma cifrelor, numărul oglindit și numărul fără cifrele 0.

Problema 1 · Definitivat 2016 · Subiectul I.3 · 10 puncte Cele mai mari două numere echilibrate

Ce cere problema

Un număr de 6 cifre este echilibrat dacă primele trei cifre au aceeași sumă ca ultimele trei. Primele trei cifre formează numărul x / 1000, iar ultimele trei formează numărul x % 1000. Pentru numerele din exemplu:

NumărulAre 6 cifre?Primele treiUltimele treiEchilibrat?
217334da2 + 1 + 7 = 103 + 3 + 4 = 10da
11110000nu, are 8——nu se ia în seamă
230104da2 + 3 + 0 = 51 + 0 + 4 = 5da
210300da2 + 1 + 0 = 33 + 0 + 0 = 3da
123456da1 + 2 + 3 = 64 + 5 + 6 = 15nu

Numerele echilibrate de 6 cifre sunt 217334, 230104, 230104 și 210300. Cele mai mari două numere distincte dintre ele sunt 230104 și 217334.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Returneaza suma cifrelor lui n. */
int sub(int n) {
    int s = 0;
    while (n > 0) {
        s = s + n % 10;
        n = n / 10;
    }
    return s;
}

Subprogramul sub(n)

  • s pornește de la 0
  • cât timp n este nenul
    • ultima cifră, n % 10, se adună la s
    • n / 10 elimină ultima cifră
  • se returnează s
int main() {
    ifstream f("def.in");
    int x;
    int m1 = 0, m2 = 0;   // cele mai mari doua, m1 > m2

    while (f >> x)
        if (x >= 100000 && x <= 999999)    // 6 cifre
            if (sub(x / 1000) == sub(x % 1000)) {
                if (x > m1) {
                    m2 = m1;
                    m1 = x;
                }
                else if (x < m1 && x > m2)
                    m2 = x;
            }

    if (m2 == 0)
        cout << "nu exista";
    else
        cout << m1 << " " << m2;
    return 0;
}

Programul principal

  • se deschide fișierul def.in pentru citire
  • m1 și m2, cele mai mari două numere echilibrate găsite, pornesc de la 0
    • un număr de 6 cifre este cel puțin 100000, deci 0 arată că nu s-a găsit încă niciun număr
  • cât timp se citește un număr x din fișier
    • dacă x are 6 cifre, adică este între 100000 și 999999
      • dacă sub(x / 1000) este egal cu sub(x % 1000), x este echilibrat
        • dacă x este mai mare decât m1, m2 primește valoarea lui m1, iar m1 primește x
        • altfel, dacă x este diferit de m1 și mai mare decât m2, m2 primește x
  • dacă m2 a rămas 0, nu există două numere distincte: se afișează nu exista
  • altfel se afișează m1 și m2, în ordine strict descrescătoare

Numerele nu se memorează într-un tablou. Pentru cele mai mari două valori sunt suficiente două variabile, actualizate la fiecare citire.

Problema 2 · Definitivat 2017 · Subiectul I.3 · 15 puncte Numere scrise cu două cifre consecutive

Ce cere problema

Un număr se numără dacă în scrierea lui apar exact două cifre diferite, iar acestea sunt consecutive, de exemplu 0 și 1 sau 8 și 9. Pentru numerele din exemplu:

NumărulCifra minimăCifra maximăDiferențaSe numără?
98891da
111110nu: o singură cifră distinctă
10010011da
3330nu
25253nu: cifrele nu sunt consecutive
322231da
123132nu: trei cifre distincte

Cu 10010, care apare de două ori, se obțin 4 numere.

Condiția se verifică numai cu cifra minimă și cifra maximă. Dacă diferența lor este 1, între ele nu mai există nicio cifră, deci numărul este scris numai cu aceste două cifre, și ambele apar.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Furnizeaza cifra minima si cifra maxima a lui n. */
void minmax(int n, int &minim, int &maxim) {
    minim = 9;
    maxim = 0;
    do {
        int c = n % 10;
        if (c < minim)
            minim = c;
        if (c > maxim)
            maxim = c;
        n = n / 10;
    } while (n > 0);
}

Subprogramul minmax(n, minim, maxim)

  • minim și maxim sunt transmiși prin referință (&), deci valorile lor ajung în programul principal
  • minim pornește de la 9, cea mai mare cifră, iar maxim de la 0, cea mai mică
  • pentru fiecare cifră c a lui n, de la dreapta la stânga
    • dacă c este mai mică decât minim, minim primește c
    • dacă c este mai mare decât maxim, maxim primește c
    • n / 10 elimină ultima cifră
  • structura do … while prelucrează cel puțin o cifră, deci pentru n = 0 se obțin minim = 0 și maxim = 0
int main() {
    ifstream f("def.in");
    int x, mi, ma, nr = 0;

    while (f >> x) {
        minmax(x, mi, ma);
        if (ma - mi == 1)     // doua cifre, consecutive
            nr++;
    }

    cout << nr;
    return 0;
}

Programul principal

  • se deschide fișierul def.in pentru citire
  • nr, numărul termenilor găsiți, pornește de la 0
  • cât timp se citește un număr x din fișier
    • se apelează minmax(x, mi, ma)
    • dacă diferența dintre cifra maximă și cifra minimă este 1, nr crește cu 1
  • se afișează nr

Problema 3 · Definitivat 2019 · Subiectul I.3 · 15 puncte Cel mai mic și cel mai mare număr cu cifrele lui n

Ce cere problema

Cu cifrele 5, 2, 0, 2 se pot scrie mai multe numere. Numărul nu poate începe cu cifra 0.

Numărul căutatCum se așază cifrelePentru n = 5202
cel mai maretoate cifrele, în ordine descrescătoare5220
cel mai micîntâi cea mai mică cifră nenulă, apoi celelalte cifre, în ordine crescătoare2025

Pentru n = 200, singurul număr care se poate scrie este 200: cel mai mic și cel mai mare coincid, deci nu există două numere.

Cifrele nu trebuie sortate. Pentru fiecare cifră c, de la 0 la 9, nrAp(n, c) spune de câte ori se scrie c în numărul construit.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Returneaza de cate ori apare cifra c in n. */
int nrAp(int n, int c) {
    int k = 0;
    do {
        if (n % 10 == c)
            k++;
        n = n / 10;
    } while (n > 0);
    return k;
}

Subprogramul nrAp(n, c)

  • k, numărul de apariții, pornește de la 0
  • pentru fiecare cifră a lui n, de la dreapta la stânga
    • dacă ultima cifră, n % 10, este egală cu c, k crește cu 1
    • n / 10 elimină ultima cifră
  • se returnează k

Structura do … while prelucrează cel puțin o cifră, deci nrAp(0, 0) returnează 1.

int main() {
    int n;
    cin >> n;
    ofstream g("def2019.out");

    /* Cel mai mare: cifrele in ordine descrescatoare. */
    int mx = 0;
    for (int c = 9; c >= 0; c--)
        for (int k = 1; k <= nrAp(n, c); k++)
            mx = mx * 10 + c;

    /* Cel mai mic: intai cea mai mica cifra nenula,
       apoi celelalte, in ordine crescatoare. */
    int p = 1;
    while (p <= 9 && nrAp(n, p) == 0)
        p++;
    int mn = 0;
    if (p <= 9) {
        mn = p;
        for (int c = 0; c <= 9; c++) {
            int k = nrAp(n, c);
            if (c == p)
                k--;              // cifra p este deja in fata
            for (int i = 1; i <= k; i++)
                mn = mn * 10 + c;
        }
    }

    if (mn < mx)
        g << mn << " " << mx;
    else
        g << "nu exista";
    return 0;
}

Programul principal

  • se citește n și se deschide fișierul def2019.out pentru scriere
  • cel mai mare număr, mx, pornește de la 0
    • pentru fiecare cifră c, de la 9 la 0
      • c se adaugă la dreapta lui mx de atâtea ori cât apare în n: mx = mx * 10 + c
  • cel mai mic număr, mn
    • p, cea mai mică cifră nenulă a lui n, se caută de la 1 în sus
    • dacă p există
      • mn pornește de la p
      • pentru fiecare cifră c, de la 0 la 9
        • k este numărul de apariții ale lui c în n; pentru c = p, k scade cu 1, deoarece o apariție a lui p este deja prima cifră
        • c se adaugă la dreapta lui mn de k ori
    • dacă p nu există, n este 0, iar mn rămâne 0
  • dacă mn este mai mic decât mx, se scriu în fișier mn și mx
  • altfel, cele două numere coincid: se scrie nu exista

Problema 4 · Definitivat 2020 · Subiectul I.3 · 15 puncte În ce baze de numerație poate fi scris un număr

Cerința este rezolvată și pe pagina subiectului: Cifra maximă și bazele de numerație.

Ce cere problema

Numerele nu se transformă dintr-o bază în alta. Un număr poate fi considerat scris în baza b dacă toate cifrele lui sunt mai mici decât b, adică dacă cifra lui maximă este mai mică decât b.

NumărulCifra maximăBazele în care poate fi scris
1000001, 100, 10101de la 2 la 10
2020, 22de la 3 la 10
5220, 505de la 6 la 10
704, 577de la 8 la 10
90, 98762, 399numai 10

Numerele care pot fi considerate scrise în fiecare bază:

  • în baza 2, 3 numere;
  • în bazele 3, 4 și 5, câte 5 numere;
  • în bazele 6 și 7, câte 7 numere;
  • în bazele 8 și 9, câte 9 numere;
  • în baza 10, toate cele 12 numere.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Returneaza cifra maxima a lui n. */
int cMax(int n) {
    int m = 0;
    while (n > 0) {
        if (n % 10 > m)
            m = n % 10;
        n = n / 10;
    }
    return m;
}

Subprogramul cMax(n)

  • m, cifra maximă, pornește de la 0
  • cât timp n este nenul
    • dacă ultima cifră, n % 10, este mai mare decât m, m primește această cifră
    • n / 10 elimină ultima cifră
  • se returnează m

Pentru n = 0, structura repetitivă nu face niciun pas, iar subprogramul returnează 0, care este chiar cifra lui n.

int main() {
    ifstream f("def2020.in");
    int nr[11] = {0};   // nr[b]: numere scrise in baza b
    int x;

    while (f >> x) {
        int m = cMax(x);
        for (int b = 2; b <= 10; b++)
            if (m < b)
                nr[b]++;
    }

    for (int b = 2; b <= 10; b++)
        cout << nr[b] << " ";
    return 0;
}

Programul principal

  • se deschide fișierul def2020.in pentru citire
  • tabloul nr are câte un contor pentru fiecare bază; nr[b] pornește de la 0
  • cât timp se citește un număr x din fișier
    • m este cifra maximă a lui x, dată de cMax(x)
    • pentru fiecare bază b, de la 2 la 10
      • dacă m este mai mică decât b, x poate fi scris în baza b: nr[b] crește cu 1
  • se afișează contoarele pentru bazele de la 2 la 10

Subprogramul se apelează o singură dată pentru fiecare număr citit. Valoarea lui se reține în m și se folosește pentru toate cele 9 baze.

Problema 5 · Definitivat 2021 · Subiectul I.3 · 15 puncte Cel mai mic număr scris cu cifrele 0, 1 și 2

Cerința este rezolvată și pe pagina subiectului: Cifre distincte și cifra maximă.

Ce cere problema

Exemplele arată că numărul căutat trebuie să folosească toate cele trei cifre 0, 1 și 2. Numerele 2020 și 2000 sunt scrise numai cu cifre din mulțime, dar nu sunt răspunsuri: lor le lipsește cifra 1.

NumărulCifre distincte (nrd)Cifra maximă (cma)Este scris cu 0, 1 și 2?
201646nu
202022nu: lipsește 1
202132da
200022nu: lipsește 1

Un număr are exact cifrele 0, 1 și 2 dacă are 3 cifre distincte și cifra maximă 2: cele trei cifre distincte, toate cel mult 2, nu pot fi decât 0, 1 și 2.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Furnizeaza numarul de cifre distincte si
   cifra maxima a lui n. */
void cifDistMax(int n, int &nrd, int &cma) {
    int ap[10] = {0};     // ap[c] = 1 daca c apare in n
    do {
        ap[n % 10] = 1;
        n = n / 10;
    } while (n > 0);

    nrd = 0;
    for (int c = 0; c <= 9; c++)
        if (ap[c] == 1) {
            nrd++;
            cma = c;      // ultima cifra gasita e maxima
        }
}

Subprogramul cifDistMax(n, nrd, cma)

  • nrd și cma sunt transmiși prin referință (&)
  • tabloul ap are câte o poziție pentru fiecare cifră, de la 0 la 9, toate pornind de la 0
  • pentru fiecare cifră a lui n, de la dreapta la stânga
    • poziția cifrei în ap primește 1
    • n / 10 elimină ultima cifră
  • nrd pornește de la 0
  • pentru fiecare cifră c, de la 0 la 9
    • dacă c apare în n
      • nrd crește cu 1
      • cma primește c; cifrele se parcurg crescător, deci ultima cifră găsită este cea maximă

Structura do … while prelucrează cel puțin o cifră, deci pentru n = 0 se obțin nrd = 1 și cma = 0.

int main() {
    int x, y, nrd, cma;
    cin >> x >> y;
    ofstream g("def.out");

    for (int i = x; i <= y; i++) {
        cifDistMax(i, nrd, cma);
        if (nrd == 3 && cma == 2) {   // cifrele 0, 1, 2
            g << i;
            return 0;
        }
    }
    g << "nu exista";
    return 0;
}

Programul principal

  • se citesc x și y și se deschide fișierul def.out pentru scriere
  • pentru fiecare număr i, de la x la y, în ordine crescătoare
    • se apelează cifDistMax(i, nrd, cma)
    • dacă i are 3 cifre distincte și cifra maximă 2
      • i este cel mai mic număr căutat, deoarece numerele se parcurg crescător
      • i se scrie în fișier, iar return 0 încheie programul
  • dacă structura repetitivă s-a încheiat fără să găsească niciun număr, se scrie nu exista

Problema 6 · Definitivat 2022 · Subiectul I.3 · 15 puncte Șirul circular asociat unui șir de numere

Cerința este rezolvată și pe pagina subiectului: Permutarea circulară a cifrelor.

Ce cere problema

Permutarea circulară la dreapta mută ultima cifră în fața celorlalte. Dacă ultima cifră este 0, ea ajunge în față și dispare din scriere.

Termenul din SUltima cifrăCelelalte cifreTermenul din CImpar?
944949da
490049049 = 49da
200202 = 2nu
278827827da
177171da
827008270827 = 827da

Numerele impare din C sunt 49, 49, 827, 71, 49, 827. Cel mai mic este 49 și apare de 3 ori.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Muta ultima cifra a lui n in fata celorlalte. */
void circular(int &n) {
    int u = n % 10;        // ultima cifra
    n = n / 10;            // celelalte cifre
    int p = 1;
    int aux = n;
    while (aux > 0) {      // p = 10 la puterea nr. de cifre
        p = p * 10;
        aux = aux / 10;
    }
    n = u * p + n;
}

Subprogramul circular(n)

  • n este transmis prin referință (&), deci rezultatul ajunge în variabila din apel
  • u primește ultima cifră, n % 10
  • n primește celelalte cifre, n / 10
  • p se calculează ca 10 la puterea numărului de cifre rămase
    • p pornește de la 1
    • pentru fiecare cifră a copiei aux, p se înmulțește cu 10
  • u * p + n pune cifra u în fața cifrelor rămase
int main() {
    ifstream f("def2022.in");
    int x, mn = 0, nr = 0;  // nr = 0: niciun impar gasit

    while (f >> x) {
        circular(x);
        if (x % 2 == 1) {
            if (nr == 0 || x < mn) {
                mn = x;
                nr = 1;
            }
            else if (x == mn)
                nr++;
        }
    }

    if (nr == 0)
        cout << "nu exista";
    else
        cout << mn << " " << nr;
    return 0;
}

Programul principal

  • se deschide fișierul def2022.in pentru citire
  • mn este cel mai mic număr impar găsit, iar nr este numărul lui de apariții
    • nr = 0 arată că nu s-a găsit încă niciun număr impar
  • cât timp se citește un număr x din fișier
    • circular(x) înlocuiește x cu termenul corespunzător din șirul circular
    • dacă x este impar
      • dacă este primul număr impar sau este mai mic decât mn, mn primește x și nr devine 1
      • altfel, dacă x este egal cu mn, nr crește cu 1
  • dacă nr a rămas 0, se afișează nu exista
  • altfel se afișează mn și nr

Problema 7 · Definitivat 2023 · Subiectul I.3 · 15 puncte Cea mai mică cifră de control

Cerința este rezolvată și pe pagina subiectului: Cifra de control a unui număr.

Ce cere problema

Suma cifrelor se calculează din nou, cât timp rezultatul are cel puțin două cifre. Pentru numerele din exemplu:

NumărulSumele succesiveCifra de control
6288
2355
7—7
5000000914, 55
2466
567927, 99
6066
899789959, 14, 55
10788
9817, 88
202377

Cea mai mică cifră de control este 5. O au 3 termeni: 23, 50000009 și 8997899.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal, așa cum se scriu pe foaia de examen. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
#include <fstream>
using namespace std;

/* Returneaza suma cifrelor lui n. */
int suma(int n) {
    int s = 0;
    while (n > 0) {
        s = s + n % 10;
        n = n / 10;
    }
    return s;
}

Subprogramul suma(n)

  • s pornește de la 0
  • cât timp n este nenul
    • ultima cifră, n % 10, se adună la s
    • n / 10 elimină ultima cifră
  • se returnează s
int main() {
    ifstream f("def2023.in");
    int x, mn = 10, nr = 0;

    while (f >> x) {
        int c = x;
        while (c > 9)        // pana ramane o cifra
            c = suma(c);
        if (c < mn) {
            mn = c;
            nr = 1;
        }
        else if (c == mn)
            nr++;
    }

    cout << mn << " " << nr;
    return 0;
}

Programul principal

  • se deschide fișierul def2023.in pentru citire
  • mn, cea mai mică cifră de control, pornește de la 10, o valoare mai mare decât orice cifră
  • nr, numărul termenilor cu cifra de control mn, pornește de la 0
  • cât timp se citește un număr x din fișier
    • c pornește de la x
    • cât timp c are cel puțin două cifre, c primește suma(c)
    • c este acum cifra de control a lui x
    • dacă c este mai mică decât mn, mn primește c și nr devine 1
    • altfel, dacă c este egală cu mn, nr crește cu 1
  • se afișează mn și nr

Problema 8 · Exercițiu Numere cu cifra 8 și numere fără cifra 8

Ce cere problema

Fiecare număr din fișier intră într-una din două grupe: numerele fără cifra 8 și numerele cu cel puțin o cifră 8. Din prima grupă se caută maximul, din a doua minimul.

GrupaNumerele din exempluRezultatul
fără cifra 812, 709, 4567, 130, 1001, 99cel mai mare: 4567
cu cifra 8888, 28045cel mai mic: 888

Cerința b) cere folosirea subprogramului de la a). Cifra maximă arată singură dacă un număr conține 8 numai când numărul nu are cifra 9. De aceea, din număr se elimină întâi cifrele 9. Numărul rămas are toate cifrele cel mult 8, deci conține cifra 8 exact atunci când cifra lui maximă este 8.

NumărulFără cifrele 9Cifra maximăConține 8?
28045280458da
709707nu
9900nu
80918018da

Programul și descrierea metodei

În stânga sunt subprogramele și programul principal. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 9 · Exercițiu Schimbarea primei cifre cu ultima cifră

Ce cere problema

Un număr cu k cifre se scrie n = a₁ · 10ᵏ⁻¹ + a₂ · 10ᵏ⁻² + … + aₖ₋₁ · 10 + aₖ. Pentru n = 6094, părțile numărului se obțin astfel:

ParteaCum se obținePentru 6094
p, 10 la puterea k − 1se înmulțește cu 10 cât timp n / p are cel puțin două cifre1000
prima cifrăn / p6
ultima cifrăn % 104
cifrele din mijlocn % p / 109

Numărul nou are ultima cifră în față, cifrele din mijloc neschimbate și prima cifră la sfârșit: 4 · 1000 + 9 · 10 + 6 = 4096. Radicalul lui 4096 este 64.

Deoarece n nu se divide cu 10, ultima cifră nu este 0, deci numărul nou are tot k cifre.

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 10 · Exercițiu O cifră comună a două numere

Ce cere problema

Pentru fiecare număr se notează ce cifre apar în el. Răspunsul este DA dacă o cifră apare în ambele.

aCifrele lui abCifrele lui bCifre comuneMesajul
833, 81191, 9—NU
50030, 3, 57200, 2, 70DA
00100, 10DA

Cifrele unui număr se marchează într-un tablou cu 10 poziții, câte una pentru fiecare cifră de la 0 la 9.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 11 · Exercițiu Suma primelor n numere naturale

Ce cere problema

Se adună toate numerele naturale de la 1 la n:

nSumaRezultatul
71 + 2 + 3 + 4 + 5 + 6 + 728
41 + 2 + 3 + 410

Suma se calculează cu formula 1 + 2 + … + n = n · (n + 1) / 2. Pentru n = 7, rezultă 7 · 8 / 2 = 28.

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 12 · Exercițiu Durata unui film în ore și minute

Ce cere problema

O oră are 60 de minute. Numărul de ore este câtul împărțirii lui x la 60, iar minutele rămase sunt restul:

xCâtul x / 60Restul x % 60Se afișează
2003203 ore 20 minute
450450 ore 45 minute
120202 ore 0 minute

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 13 · Exercițiu Timpul de mers al unui tren, în minute

Ce cere problema

Formula timp = distanța / viteză dă timpul în ore. O oră are 60 de minute, deci timpul în ore se înmulțește cu 60:

v (km/h)Timpul în ore, 60 / vTimpul în minute
501,272
60160
800,7545

Viteza este un număr real, iar timpul poate avea zecimale. Pentru v = 70 se afișează 51.4286.

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 14 · Exercițiu Unul dintre trei numere este suma celorlalte două

Ce cere problema

Fiecare dintre cele trei numere poate fi suma celorlalte două. Se verifică toate posibilitățile:

  • a = b + c;
  • b = a + c;
  • c = a + b.

Dacă cel puțin una este adevărată, se afișează „este posibil”.

a, b, ca = b + cb = a + cc = a + bSe afișează
3, 8, 53 = 13, fals8 = 8, adevărat5 = 11, falseste posibil
2, 9, 42 = 13, fals9 = 6, fals4 = 11, falsnu este posibil

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 15 · Exercițiu Suma cifrelor unui număr de trei cifre

Ce cere problema

Numărul 254 are cifrele 2, 5 și 4, iar suma lor este 11. Fiecare cifră se obține din n prin câtul și restul împărțirii:

CifraExpresiaPentru n = 254
sutelen / 1002
zecilen / 10 % 1025 % 10 = 5
unitățilen % 104

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 16 · Exercițiu Cea mai mare putere a lui 2 cel mult egală cu n

Ce cere problema

Puterile lui 2 sunt 1, 2, 4, 8, 16, 32 și așa mai departe, fiecare fiind dublul celei dinainte. Prima putere, 2⁰, este 1. Se caută ultima putere care nu depășește n:

nPuterile lui 2 mai mici sau egale cu nSe afișează
91, 2, 4, 88
111
161, 2, 4, 8, 1616

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 17 · Exercițiu Suma și produsul cifrelor unui număr

Ce cere problema

Cifrele se iau pe rând de la dreapta: ultima cifră este n % 10, iar n / 10 este numărul fără ultima cifră. Pentru câteva numere:

nCifreleSumaProdusul
2342, 3, 4924
23052, 3, 0, 5100
0000

Subprogramul determină două valori. Ele se transmit prin doi parametri de ieșire, s și p.

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 18 · Exercițiu Număr palindrom

Ce cere problema

Un număr este palindrom dacă este egal cu inversul său, adică numărul scris cu aceleași cifre în ordine inversă. Programul afișează DA pentru un palindrom și NU în caz contrar:

nInversulSe afișează
1232112321DA
123321NU
77DA

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 19 · Exercițiu Pătrat perfect

Ce cere problema

Pătratele perfecte sunt 0, 1, 4, 9, 16, 25, 36 și așa mai departe. Un număr este pătrat perfect dacă rădăcina lui pătrată este un număr natural:

n√nPătrat perfect?
164da: 4 · 4 = 16
20aproximativ 4,47nu
00da: 0 · 0 = 0

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 20 · Exercițiu Primii n termeni ai șirului lui Fibonacci

Ce cere problema

Primii doi termeni sunt 1. Fiecare termen următor este suma celor doi termeni dinaintea lui:

i1234567
fᵢ111 + 1 = 21 + 2 = 32 + 3 = 53 + 5 = 85 + 8 = 13

Pentru un termen nou sunt necesari numai ultimii doi termeni, deci șirul nu se memorează într-un tablou.

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

#include <iostream>
using namespace std;

int main() {
    int n;
    long long a1, a2, a3;
    cin >> n;
    a1 = 1;
    a2 = 1;
    cout << a1 << " " << a2;
    for (int i = 3; i <= n; i++) {
        a3 = a1 + a2;
        cout << " " << a3;
        a1 = a2;
        a2 = a3;
    }
    return 0;
}

Programul principal

  • se citește n
  • a1 și a2, primii doi termeni, primesc valoarea 1 și se afișează
  • pentru i de la 3 la n
    • termenul de rang i, a3, este suma a1 + a2 și se afișează
    • ultimii doi termeni devin a2 și a3
      • a1 primește valoarea lui a2
      • a2 primește valoarea lui a3

Problema 21 · Exercițiu Perechi consecutive în care al doilea număr este suma cifrelor primului

Ce cere problema

Se iau pe rând toate perechile de numere vecine din șir. Valoarea 0 încheie șirul și nu face parte din el.

PerecheaSuma cifrelor primului numărSe afișează?
123, 61 + 2 + 3 = 6da
6, 26nu
2, 452nu
45, 94 + 5 = 9da
9, 59nu
5, 185nu
18, 91 + 8 = 9da

Programul și descrierea metodei

În stânga sunt subprogramul și programul principal. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 22 · Exercițiu Număr cu aspect de munte

Ce cere problema

Citit de la stânga, numărul trebuie să aibă o parte care urcă și apoi o parte care coboară. Ambele părți există, iar ordinea este strictă: un număr cu două cifre vecine egale nu are aspect de munte.

nCitit de la stângaAspect de munte?
123421urcă 1 < 2 < 3 < 4, coboară 4 > 2 > 1da
12321urcă 1 < 2 < 3, coboară 3 > 2 > 1da
123numai urcănu
321numai coboarănu
12212 = 2nu
13231urcă, coboară, apoi urcă din nounu

Cifrele se obțin de la dreapta: n % 10 este cifra unităților, iar n / 10 % 10 este cifra zecilor. De aceea programul parcurge întâi partea care coboară, apoi partea care urcă.

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Problema 23 · Exercițiu Număr cu aspect de vale

Ce cere problema

Citit de la stânga, numărul trebuie să aibă o parte care coboară și apoi o parte care urcă. Ambele părți există, iar ordinea este strictă: un număr cu două cifre vecine egale nu are aspect de vale.

nCitit de la stângaAspect de vale?
43214coboară 4 > 3 > 2 > 1, urcă 1 < 4da
101coboară 1 > 0, urcă 0 < 1da
4321numai coboarănu
1234numai urcănu
31131 = 1nu

Cifrele se obțin de la dreapta: n % 10 este cifra unităților, iar n / 10 % 10 este cifra zecilor. De aceea programul parcurge întâi partea care urcă, apoi partea care coboară.

Programul și descrierea metodei

În stânga este programul. În dreapta este metoda de rezolvare, descrisă în limbaj natural, cu pașii așezați pe niveluri după structura programului.

Materialul acesta se citește pe educamp.ro și nu se tipărește.

Vezi problemele rezolvate ca și cursant

Lista categoriilor, cu problemele date la examen în fiecare, se citește gratuit și integral. Pentru a citi rezolvările, te înscrii la cursul de pregătire.

Te înscrii, alegi în cont când începe cursul și plătești prima lună prin transfer bancar. Pentru a vedea mai întâi ce probleme s-au dat, poți reveni la lista categoriilor.

Acces la suportul de curs

25 RON / lună, fără ședințe

Ce cuprinde:

  • Acces la toate lecțiile disponibile
  • Suport de curs pentru tematica științifică și metodică
  • Exemple, explicații și exerciții
  • Acces la materialele noi adăugate pe platformă
  • Posibilitatea de a adresa întrebări

Înscrie-te Cum plătești Login