RECURSIVITATE:
1.Să se scrie o funcție C++ recursivă care returnează cel mai mare
divizor comun a două numere transmise ca parametri.
int cmmdc(int a, int b){
if(b == 0)
return a;
else return cmmdc(b, a % b);
}
Intrare:
12 4
Iesire:
[Link] dă un număr natural n. Să se genereze o matrice pătratică de
dimensiune 2n-1, după următoarele reguli:
● elementul din mijlocul matricii este egal cu n
● elementele de pe linia mediană și cele de pe coloana mediană
(exceptând elementul din mijlocul matricii) sunt nule
● folosind linia mediană și coloana mediană, se împarte
matricea în alte 4 matrici care se generează similar, dar au
dimensiunea 2n-1-1.
#include <iostream>
using namespace std;
int m[511][511];
void pat(int n, int L, int l, int c) {
L /= 2;
m[l][c] = n;
if (n > 1) {
int semiLatura = L / 2 + 1;
pat(n - 1, L, l - semiLatura, c - semiLatura);
pat(n - 1, L, l - semiLatura, c + semiLatura);
pat(n - 1, L, l + semiLatura, c - semiLatura);
pat(n - 1, L, l + semiLatura, c + semiLatura);
}
}
int main() {
int n;
cin >> n;
int L = pow(2, n) - 1;
pat(n, L, L / 2, L / 2);
for(int i = 0; i < L; i++) {
for(int j = 0; j < L; j++)
cout<<m[i][j]<<" ";
cout<<endl;
}
return 0;
}
Intrare:
Iesire:
1 0 1 0 1 0 1
0 2 0 0 0 2 0
1 0 1 0 1 0 1
0 0 0 3 0 0 0
1 0 1 0 1 0 1
0 2 0 0 0 2 0
1 0 1 0 1 0 1
3. Pentru o serie de activități foarte sofisticate, Gigel are nevoie
de un fierăstrău special, alcătuit din mai mulţi dinţi. Un fierăstrău
de gradul n este format din două fierăstraie de gradul n-1, între care
se află un dinte de mărime n. Un fierăstrău de gradul 1 are un singur
dinte, de mărime 1.
Afișați un fierăstrău de grad n.
#include <iostream>
using namespace std;
void dinti(int n){
if(n == 1) cout << 1;
else{
dinti(n-1);
cout << n << " ";
dinti(n-1);
int main(){
int n;
cin >> n;
dinti(n);
return 0;
Intrare:
Iesire:
1 2 1 3 1 2 1
4. Prietenul nostru, Ionci, a învățat la scoală despre ridicarea la
putere. Ajutați-l să calculeze a^b.
#include <iostream>
using namespace std;
long long int pow(int a, int b){
if(b != 0)
return a * pow(a, b-1);
else return 1;
int main()
{
int a, b;
cin>>a>>b;
cout<<pow(a, b);
return 0;
Intrare:
5 4
Iesire:
625
[Link] da un tablou de n elemente, unde număr de elemente n este citit
de la tastatura împreuna cu elementele tabloului. Sa se calculeze si
sa se afiseze produsul elementelor pare de pe poziții impare.
#include <iostream>
using namespace std;
int pv(int v[], int n){
if(n!=0)
(v[n]%2==0&&n%2)?return v[n]*pv(v, n - 1):return
1*pv(v,n-1);
else return 1;
int main()
{
int n, v[101];
cin>>n;
for(int i = 1; i <= n; i++)
cin>>v[i];
cout<<pv(v, n);
return 0;
Intrare:
4 4 5 3 6 7
Iesire:
24
6. Sa se afiseze elementele divizibile cu 3 dintr-un vector de n
elemente, citite de la tastatura.
#include <iostream>
using namespace std;
void suma(int a[], int n, int &s){
if(n!=0)
(a[n]%3 == 0)? s+=a[n], suma(a, n - 1, s) : suma(a, n -
1, s);
int main(){
int a[101], s = 0, n;
cin>>n;
for(int i = 1; i<=n;i++)
cin>>a[i];
suma(a, n, s);
cout<<s;
Intrare:
3 3 9 13 10
Iesire:
15
7. Sa se afiseze elementele care sunt divizibile cu suma cifrelor,
dintr-un tablou cu n elemente citit de la tastatura.
#include <iostream>
using namespace std;
int sumaCif(int x){
if(x!=0)
return x%10 + sumaCif(x/10);
void AfisareElem(int v[], int n){
if(n!=0)
(v[n]%sumaCif(v[n]) == 0)? cout<<v[n]<<" ", AfisareElem(v, n
- 1) : AfisareElem(v, n - 1);
int main(){
int a[101], n;
cin>>n;
for(int i = 1; i <= n; i++)
cin>>a[i];
AfisareElem(a, n);
Intrare:
10
27 101 47 36 98 45 13 54 55 63
Iesire:
27 36 45 54 63
8. Sa se afiseze elemente palindromice pare care se afla intr-un
tablou, cu n elemente citite de la tastatura.
#include <iostream>
using namespace std;
int palindrom(int x){
if(x!=0)
return x%10 + palindrom(x/10) * 10;
}
void AfisareElem(int v[], int n){
if(n!=0)
(v[n]%2 == 0 && v[n] == palindrom(v[n]))? cout<<v[n]<<" ",
AfisareElem(v, n - 1) : AfisareElem(v, n - 1);
}
int main(){
int a[101], n;
cin>>n;
for(int i = 1; i <= n; i++)
cin>>a[i];
AfisareElem(a, n);
}
Intrare:
5
101 87 32 22 11
Iesire:
22