Probleme rezolvate pe categorii
Numere și cifre
Î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.
| Anul | Ce face subprogramul | Ce face programul |
|---|---|---|
| 2016 | returnează suma cifrelor | găsește cele mai mari două numere echilibrate |
| 2017 | furnizează cifra minimă și cifra maximă | numără termenii cu două cifre consecutive |
| 2019 | returnează numărul de apariții ale unei cifre | construiește cel mai mic și cel mai mare număr din cifrele date |
| 2020 | returnează cifra maximă | numără, pentru fiecare bază, numerele care pot fi scrise în ea |
| 2021 | furnizează numărul de cifre distincte și cifra maximă | caută cel mai mic număr scris cu cifrele 0, 1 și 2 |
| 2022 | mută ultima cifră în fața celorlalte | caută cel mai mic număr impar și îl numără |
| 2023 | returnează suma cifrelor | determină 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.
| n | n % 10 | n / 10 |
|---|---|---|
| 3425 | 5 | 342 |
| 342 | 2 | 34 |
| 34 | 4 | 3 |
| 3 | 3 | 0 |
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ărul | Are 6 cifre? | Primele trei | Ultimele trei | Echilibrat? |
|---|---|---|---|---|
| 217334 | da | 2 + 1 + 7 = 10 | 3 + 3 + 4 = 10 | da |
| 11110000 | nu, are 8 | — | — | nu se ia în seamă |
| 230104 | da | 2 + 3 + 0 = 5 | 1 + 0 + 4 = 5 | da |
| 210300 | da | 2 + 1 + 0 = 3 | 3 + 0 + 0 = 3 | da |
| 123456 | da | 1 + 2 + 3 = 6 | 4 + 5 + 6 = 15 | nu |
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 / 10elimină ultima cifră
- 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.inpentru 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 cusub(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ă
- dacă x are 6 cifre, adică este între 100000 și 999999
- 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ărul | Cifra minimă | Cifra maximă | Diferența | Se numără? |
|---|---|---|---|---|
| 98 | 8 | 9 | 1 | da |
| 111 | 1 | 1 | 0 | nu: o singură cifră distinctă |
| 10010 | 0 | 1 | 1 | da |
| 3 | 3 | 3 | 0 | nu |
| 25 | 2 | 5 | 3 | nu: cifrele nu sunt consecutive |
| 322 | 2 | 3 | 1 | da |
| 123 | 1 | 3 | 2 | nu: 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 / 10elimină ultima cifră
- structura
do … whileprelucrează 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.inpentru 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 apelează
- 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ăutat | Cum se așază cifrele | Pentru n = 5202 |
|---|---|---|
| cel mai mare | toate cifrele, în ordine descrescătoare | 5220 |
| cel mai mic | întâi cea mai mică cifră nenulă, apoi celelalte cifre, în ordine crescătoare | 2025 |
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 / 10elimină ultima cifră
- dacă 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.outpentru 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
- c se adaugă la dreapta lui mx de atâtea ori cât apare în n:
- pentru fiecare cifră c, de la 9 la 0
- 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ărul | Cifra maximă | Bazele în care poate fi scris |
|---|---|---|
| 1000001, 100, 1010 | 1 | de la 2 la 10 |
| 2020, 2 | 2 | de la 3 la 10 |
| 5220, 50 | 5 | de la 6 la 10 |
| 704, 57 | 7 | de la 8 la 10 |
| 90, 98762, 39 | 9 | numai 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 / 10elimină ultima cifră
- dacă 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.inpentru 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
- dacă m este mai mică decât b, x poate fi scris în baza b:
- m este cifra maximă a lui x, dată de
- 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ărul | Cifre distincte (nrd) | Cifra maximă (cma) | Este scris cu 0, 1 și 2? |
|---|---|---|---|
| 2016 | 4 | 6 | nu |
| 2020 | 2 | 2 | nu: lipsește 1 |
| 2021 | 3 | 2 | da |
| 2000 | 2 | 2 | nu: 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 / 10elimină 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ă
- dacă c apare în n
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.outpentru 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
- se apelează
- 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 S | Ultima cifră | Celelalte cifre | Termenul din C | Impar? |
|---|---|---|---|---|
| 94 | 4 | 9 | 49 | da |
| 490 | 0 | 49 | 049 = 49 | da |
| 20 | 0 | 2 | 02 = 2 | nu |
| 278 | 8 | 27 | 827 | da |
| 17 | 7 | 1 | 71 | da |
| 8270 | 0 | 827 | 0827 = 827 | da |
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 + npune 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.inpentru 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ărul | Sumele succesive | Cifra de control |
|---|---|---|
| 62 | 8 | 8 |
| 23 | 5 | 5 |
| 7 | — | 7 |
| 50000009 | 14, 5 | 5 |
| 24 | 6 | 6 |
| 5679 | 27, 9 | 9 |
| 60 | 6 | 6 |
| 8997899 | 59, 14, 5 | 5 |
| 107 | 8 | 8 |
| 98 | 17, 8 | 8 |
| 2023 | 7 | 7 |
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 / 10elimină ultima cifră
- 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.inpentru 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.
| Grupa | Numerele din exemplu | Rezultatul |
|---|---|---|
| fără cifra 8 | 12, 709, 4567, 130, 1001, 99 | cel mai mare: 4567 |
| cu cifra 8 | 888, 28045 | cel 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ărul | Fără cifrele 9 | Cifra maximă | Conține 8? |
|---|---|---|---|
| 28045 | 28045 | 8 | da |
| 709 | 70 | 7 | nu |
| 99 | 0 | 0 | nu |
| 8091 | 801 | 8 | da |
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:
| Partea | Cum se obține | Pentru 6094 |
|---|---|---|
| p, 10 la puterea k − 1 | se înmulțește cu 10 cât timp n / p are cel puțin două cifre | 1000 |
| prima cifră | n / p | 6 |
| ultima cifră | n % 10 | 4 |
| cifrele din mijloc | n % p / 10 | 9 |
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.
| a | Cifrele lui a | b | Cifrele lui b | Cifre comune | Mesajul |
|---|---|---|---|---|---|
| 83 | 3, 8 | 119 | 1, 9 | — | NU |
| 5003 | 0, 3, 5 | 720 | 0, 2, 7 | 0 | DA |
| 0 | 0 | 10 | 0, 1 | 0 | DA |
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:
| n | Suma | Rezultatul |
|---|---|---|
| 7 | 1 + 2 + 3 + 4 + 5 + 6 + 7 | 28 |
| 4 | 1 + 2 + 3 + 4 | 10 |
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:
| x | Câtul x / 60 | Restul x % 60 | Se afișează |
|---|---|---|---|
| 200 | 3 | 20 | 3 ore 20 minute |
| 45 | 0 | 45 | 0 ore 45 minute |
| 120 | 2 | 0 | 2 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 / v | Timpul în minute |
|---|---|---|
| 50 | 1,2 | 72 |
| 60 | 1 | 60 |
| 80 | 0,75 | 45 |
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, c | a = b + c | b = a + c | c = a + b | Se afișează |
|---|---|---|---|---|
| 3, 8, 5 | 3 = 13, fals | 8 = 8, adevărat | 5 = 11, fals | este posibil |
| 2, 9, 4 | 2 = 13, fals | 9 = 6, fals | 4 = 11, fals | nu 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:
| Cifra | Expresia | Pentru n = 254 |
|---|---|---|
| sutele | n / 100 | 2 |
| zecile | n / 10 % 10 | 25 % 10 = 5 |
| unitățile | n % 10 | 4 |
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:
| n | Puterile lui 2 mai mici sau egale cu n | Se afișează |
|---|---|---|
| 9 | 1, 2, 4, 8 | 8 |
| 1 | 1 | 1 |
| 16 | 1, 2, 4, 8, 16 | 16 |
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:
| n | Cifrele | Suma | Produsul |
|---|---|---|---|
| 234 | 2, 3, 4 | 9 | 24 |
| 2305 | 2, 3, 0, 5 | 10 | 0 |
| 0 | 0 | 0 | 0 |
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:
| n | Inversul | Se afișează |
|---|---|---|
| 12321 | 12321 | DA |
| 123 | 321 | NU |
| 7 | 7 | DA |
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 | √n | Pătrat perfect? |
|---|---|---|
| 16 | 4 | da: 4 · 4 = 16 |
| 20 | aproximativ 4,47 | nu |
| 0 | 0 | da: 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:
| i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| fᵢ | 1 | 1 | 1 + 1 = 2 | 1 + 2 = 3 | 2 + 3 = 5 | 3 + 5 = 8 | 5 + 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.
| Perechea | Suma cifrelor primului număr | Se afișează? |
|---|---|---|
| 123, 6 | 1 + 2 + 3 = 6 | da |
| 6, 2 | 6 | nu |
| 2, 45 | 2 | nu |
| 45, 9 | 4 + 5 = 9 | da |
| 9, 5 | 9 | nu |
| 5, 18 | 5 | nu |
| 18, 9 | 1 + 8 = 9 | da |
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.
| n | Citit de la stânga | Aspect de munte? |
|---|---|---|
| 123421 | urcă 1 < 2 < 3 < 4, coboară 4 > 2 > 1 | da |
| 12321 | urcă 1 < 2 < 3, coboară 3 > 2 > 1 | da |
| 123 | numai urcă | nu |
| 321 | numai coboară | nu |
| 1221 | 2 = 2 | nu |
| 13231 | urcă, coboară, apoi urcă din nou | nu |
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.
| n | Citit de la stânga | Aspect de vale? |
|---|---|---|
| 43214 | coboară 4 > 3 > 2 > 1, urcă 1 < 4 | da |
| 101 | coboară 1 > 0, urcă 0 < 1 | da |
| 4321 | numai coboară | nu |
| 1234 | numai urcă | nu |
| 3113 | 1 = 1 | nu |
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.
S-a încheiat minutul de citit liber.
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