Sunteți pe pagina 1din 48

1.

CifFrecv
Să se scrie un program care citeşte cel mult 1.000.000 de numere naturale din intervalul închis [0,9] şi determină cel mai mare număr
prim citit şi numărul său de apariții.

#include <fstream>

using namespace std;

ifstream in ("ciffrecv.in");
ofstream out ("ciffrecv.out");

const int N = 10;

int a[N];

int main()
{
int nr, max=0, k;
while(in >> nr)
{
if(nr==2 || nr==3 || nr==5 || nr==7)
a[nr] += 1;
}
for(int i=7; i>=2; i--)
{
if(a[i]!=0)
{
max = i;
k = a[i];
break;
}
}
out << max << " " << k;
return 0;
}

2. CifreOrd
Se dau n cifre zecimale. Să se afişeze aceste cifre în ordine crescătoare.

#include <fstream>

using namespace std;

const int VMAX = 10;


const int LIN = 20;

int nr[VMAX];
int main()
{
ifstream in("cifreord.in");
ofstream out("cifreord.out");
int n;
in >> n;
for (int i = 0; i < n; i++)
{
int cif;
in >> cif;
nr[cif]++;
}
in.close();
int lin = 0;
for (int i = 0; i < VMAX; i++)//parcurgem valorile posibile in ordine crescatoare
{
for (int j = 0; j < nr[i]; j++)//scriem i de nr[i] ori
{
out << i;
lin++;
if (lin == LIN)
{
out << "\n";
lin = 0;
}
else
{
out << " ";
}
}
}
out.close();
return 0;
}

3. Unice
Se dau n numere numere naturale cu cel mult două cifre fiecare. Să se determine acele numere care apar o singură dată.

#include <fstream>

using namespace std;

ifstream in("unice.in");
ofstream out("unice.out");

const int N = 100000;


int a[N];

int main()
{
int n;
in >> n;
for(int i=0 ; i<n ; i++)
in >> a[i];
sort(a,a+n);
for(int i=0 ; i<n ; i++)
{
if(a[i]!=a[i-1] && a[i]!=a[i+1])
out << a[i] << " ";
}
in.close();
out.close();
return 0;
}

4. Count5
Se dă un vector cu n numere naturale. Să se determine câte dintre perechile de elemente din vector sunt formate din valori cu aceeași sumă a cifrelor.

#include <iostream>

using namespace std;

int suma_cifre (int nr)


{
int S=0;
do
{
int cif = nr%10;
S += cif;
nr = nr/10;
}
while (nr!=0);
return S;
}

int comb_de_n_cate2 (int n)


{
int comb = n*(n-1)/2;
return comb;
}

int main()
{
int n, x, vec_suma[82]={0}, nr_perechi=0;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
int SC = suma_cifre (x);
vec_suma[SC]++;
}
for (int i=0; i<82; i++)
if (vec_suma[i] > 1)
{
//cout << i << " " << vec_suma [i] << " ";
int per_suma_i = comb_de_n_cate2 (vec_suma[i]);
nr_perechi = nr_perechi + per_suma_i;
}
cout << nr_perechi << "\n";
return 0;
}

5. Produs
Se dau două șiruri cu câte n, respectiv m elemente. Dacă înmulțim fiecare element din primul șir cu fiecare element din al doilea șir, să se afle câte
produse sunt mai mici decât p.

#include <iostream>

using namespace std;

const int NrMax = 10000;

int a[NrMax], b[NrMax], spb[NrMax];

int main()
{
int n, m, p, x, cnt, poz; /// citim cele doua siruri in variabila x
cin >> n >> p; /// p este valoarea care trebuie sa fie plafon pt produs elem celor 2 siruri
for(int i=1; i<=n; i++) /// citim primul sir (cu n elemente) in variabila x si facem
{ /// vector de frecventa a[] al celor n valori citite, toate < NrMax = 10000
cin >> x;
a[x]++;
}
cin >> m;
for(int i=1; i<=m; i++) /// citim primul sir (cu m elemente) in variabila x si facem
{ /// vector de frecventa b[] al celor m valori citite, toate < NrMax = 10000
cin>>x;
b[x]++;
}

spb[0] = b[0]; /// spb[] este vector de sume partiale construit pe baza vectorului de frecventa b[]
for(int i=1; i<=NrMax; i++)
{
spb[i] = spb[i-1] + b[i]; /// constructia vectorului de sume partiale cu semnificatia spb[i] - cate
} /// numeremai mici decat i avem in sirul al doilea de m elemente

cnt = a[0]*m; /// daca avem elem egale cu 0 in primul sir, putem initializa cnt cu frecv a[0] * nr elem din sir 2
for(int i=1; i < NrMax; i++)
{
poz = (p-1)/i; /// in poz calculam care este val max care inmultita cu i, ramane < p
if(poz < NrMax)
{
cnt = cnt + a[i]*spb[poz]; /// doar numerele pana la maximum poz satisfac conditia problemei, adica spb[poz]
}
else
{
cnt = cnt + a[i]*m; /// toate m elem ale sirului 2 satisfac conditia de produs < p
}
}
cout << cnt;

return 0;
}

6. Frecventa1
Se dau n numere naturale cu cel mult două cifre fiecare. Afişaţi valorile distincte în ordinea descrescătoare a numărului de apariţii.

#include <fstream>
#include <algorithm>

using namespace std;

const int VMAX = 100;

pair <int, short int> v[VMAX];///voi avea v[i].first=nr. de ap. ale lui i(cu minus); v[i].second=valoarea de pe poz. i
///de exemplu, daca 52 apare in sir de 1014 ori, voi avea un v[i] cu v[i].first=-1014, v[i].second=52

int main()
{
ifstream in("frecventa1.in");
ofstream out("frecventa1.out");
int n;
in >> n;
for (int i = 0; i < n; i++)
{
int x;
in >> x;
v[x].first--;///scad frecventa (prefer sa retin nr. aparitiilor cu minus)
v[x].second = x;///voi avea nevoie si de valoarea coresp.
}
in.close();
sort(v, v + VMAX);///cand folosesc sort, perechile vor fi ord. cresc. dupa first-uri si in caz de egalitate
///tot crescator dupa second-uri
int i = 0;///vectorul e acum ordonat si nu mai ramane decat sa afisez second-urile
while (i < VMAX && v[i].first < 0)///ma aopresc cand ajung la valori care de fapt nu au fost citite
{
out << v[i].second << " ";
i++;
}
out.close();
return 0;
}

7. Eratostene
Se dau n numere naturale mai mici decât 1.000.000. Determinaţi câte dintre ele sunt prime.

#include <bits/stdc++.h>
using namespace std;

ifstream in("eratostene.in");
ofstream out("eratostene.out");

const int NMAX = 1000000;

bitset <NMAX + 1> ciur;

void Ciur()
{
int j = 0;
for (int i = 2; i * i <= NMAX; i++) {
if (ciur[i] == false) {
for (int multiplu = i * i; multiplu <= NMAX; multiplu += i) {
ciur[multiplu] = true;
}
}
}
}

int main()
{
Ciur();
int n, cate = 0;
in >> n;
for (int i = 1; i <= n; i++) {
int v;
in >> v;
if (!ciur[v])
{
cate++;
}
}
out << cate << "\n";
in.close();
out.close();
return 0;
}

8.Bitsort
Se dă un vector cu n elemente, numere naturale nenule. Afișați termenii în ordine crescătoare.

Termenii care apar de mai multe ori se vor afișa o singură dată.

#include <iostream>
#include <bitset>

using namespace std;

bitset <300001> a;

int main()
{
int n, x;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
a[x] = 1;
}
for (int i=1; i<300001; i++)
if (a[i] != 0)
cout << i << " ";
return 0;
}

9. PareImpare
Se dau cel mult 100.000 de numere naturale, cu cel mult 2 cifre fiecare. Afişaţi în ordine strict crescătoare valorile impare care se regăsesc
printre valorile date, şi în ordine strict descrescătoare valorile pare care se regăsesc printre valorile date.

#include <fstream>

#include <bitset>

using namespace std;


const int VMAX=100;

bitset <VMAX> nr;

int main()
{
ifstream in("pareimpare.in");
ofstream out("pareimpare.out");
int x;
while (in >> x)
{
if (x<VMAX && x>=0)
nr[x] = 1;
}
for (int i=1; i<VMAX; i=i+2)
{
if (nr[i] == 1)
out << i << " ";
}
out << "\n";
for (int i=VMAX; i>=0; i=i-2)
{
if (nr[i] == 1)
out << i << " ";
}
in.close();
out.close();
return 0;
}

10. NrLipsa2
Fișierul de intrare conține cel mult 1.000.000 de numere întregi. Se cere să se afișeze în fișierul de ieșire cel mai mic număr din intervalul [-
100,100] care nu apare în fișierul de intrare.

Dacă nu există un astfel de număr se va afișa mesajul nu exista.

#include <fstream>
#include <bitset>

using namespace std;

const int VMAX=201;

bitset <VMAX> nr_2cifre ;

int main()
{
ifstream in("nrlipsa2.in");
ofstream out("nrlipsa2.out");
int x;
while (in >> x)
{
x = x + 100;
if (x<VMAX && x>=0)
nr_2cifre[x] = 1;
}
int a=-200;
for (int x=0; x <VMAX && a==-200; x++)
if (!nr_2cifre[x])
a = x-100;
if (a==-200)
out << "nu exista";
else
out << a ;
in.close();
out.close();
return 0;
}

11. CifreOrd1
Se dau mai multe numere naturale, fiecare cu cel mult 9 cifre. Să se afişeze, în ordine descrescătoare, toate cifrele care apar în numerele
date.

#include <fstream>

using namespace std;

const int VMAX = 10;


const int LIN = 20;

int main()
{
ifstream in("cifreord1.in");
ofstream out("cifreord1.out");
int cifre[VMAX], x, cif, lin=0;
while (in >> x)
{
do
{
cif = x%10;
cifre[cif]++ ;
x = x/10;
}
while (x!=0);
}
for (int cif = VMAX-1; cif>=0; cif--)
{
while (cifre[cif] >0)
{
out << cif;
lin++;
if (lin == LIN)
{
out << "\n";
lin = 0;
}
else
out << " ";
cifre[cif]--;
}
}
in.close();
out.close();
return 0;
}

12. SumChef
Fiind dat un şir cu n elemente numere naturale, să se calculeze suma cuburilor cifrelor tuturor numerelor din şir.

#include <iostream>

using namespace std;

const int VMAX = 10;


int frecv_cifre[VMAX];

int cubul_lui_n (int n)


{
int cub = n*n*n;
return cub;
}

int main()
{
int n, x, cif;
long long S=0 ;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
while (x!=0)
{
cif = x%10;
frecv_cifre[cif]++ ;
x = x/10;
}
}
for (cif=0; cif<VMAX; cif++)
if (frecv_cifre[cif]>0)
{
S = S + cubul_lui_n (cif) * frecv_cifre[cif] ;
}
cout << S;
return 0;
}

13. NrLipsa1
Fișierul de intrare conține cel puțin 3 și cel mult 1.000.000 de numere naturale. Se cere să se afișeze în fișierul de ieșire, separate printr-un spaţiu,
două numere distincte, anume cel mai mic număr par cu două cifre și cel mai mare număr par cu două cifre care NU fac parte din şir.

#include <fstream>

#include <bitset>

using namespace std;

const int VMAX=99;


const int VMIN=10;

ifstream in("nrlipsa1.in");
ofstream out ("nrlipsa1.out");

bitset <VMAX+1> apartine;

int main()
{
int nr;
while(in >> nr)
if(nr >= VMIN && nr <= VMAX)
apartine [nr]=1;
int p = -1, u = -1;
for(int i = VMIN ; i <= VMAX; i += 2)
{
if(apartine[i] == 0)
{
if (p==-1)
p = i;
u=i;
}
}
if (p!=u)
out << p << " " << u;
else
out << "nu exista";
in.close();
out.close();
return 0;
}

14. Numere8
Se dă o listă cu numere naturale. Să se determine numerele naturale nenule cu cel mult patru cifre care nu apar în lista dată.

#include <fstream>
#include <bitset>

using namespace std;

const int VMAX = 10000;

bitset <VMAX> c;//se comporta la fel ca bool c[VMAX], dar foloseste cate un bit pentru fiecare element
//deci de 8 ori mai putina memorie

int main()
{
ifstream in("numere8.in");
ofstream out("numere8.out");
int x;
while (in >> x)
{
if (x < VMAX)
{
c[x] = 1;
}
}
in.close();
x= VMAX - 1;
while (x > 0)
{
if (!c[x])//x nu a fost citit, deci nu apartine sirului dat
{
out << x << " ";
}
x--;
}
out.close();
return 0;
}
15. Numere1
Se dau n numere naturale. Determinaţi cele mai mari două numere cu trei cifre care nu apar printre numerele date.

#include <iostream>
#include <bitset>

using namespace std;

const int VMAX = 1000;

bitset <VMAX> c;//se comporta la fel ca bool c[VMAX], dar foloseste cate un bit pentru fiecare element
//deci de 8 ori mai putina memorie

int main()
{
int n, x;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
if (x < VMAX)
{
c[x] = 1;
}
}
int a = 0, b = 0;
x = VMAX - 1;
while (x >= VMAX / 10 && b == 0)
{
if (!c[x])//x nu a fost citit, deci nu apartine sirului dat
{
if (a == 0)
{
a = x;
}
else
{
b = x;
}
}
x--;
}
if (b == 0)//am gasit cel mult un numar lipsa
{
cout << "NU EXISTA";
}
else
{
cout << b << " " << a;
}
return 0;
}

16. NrLipsa
Se dau mai multe numere naturale cu cel mult 9 cifre fiecare. Să se determine cele mai mari două numere de 3 cifre care nu se găsesc printre
numerele date.

#include <fstream>
#include <bitset>

using namespace std;

const int VMAX = 1000;

bitset <VMAX> c;//se comporta la fel ca bool c[VMAX], dar foloseste cate un bit pentru fiecare element
//deci de 8 ori mai putina memorie

int main()
{
ifstream in("nrlipsa.in");
ofstream out("nrlipsa.out");
int x;
while (in >> x)
{
if (x < VMAX)
{
c[x] = 1;
}
}
in.close();
int a = 0, b = 0;
x = VMAX - 1;
while (x >= VMAX / 10 && b == 0)
{
if (!c[x])//x nu a fost citit, deci nu apartine sirului dat
{
if (a == 0)
{
a = x;
}
else
{
b = x;
}
}
x--;
}
if (b == 0)//am gasit cel mult un numar lipsa
{
out << "NU";
}
else
{
out << a << " " << b;
}
out.close();
return 0;
}

17. joc2020
Gigel a descoperit un nou joc. Jocul are n nivele și la fiecare nivel îți dă câte un număr natural x. Pentru a trece nivelul trebuie să calculezi
câți divizori are numărul x. Scrieți un program care să permită terminarea jocului prin trecerea celor n nivele în ordinea în care sunt date.

#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

ifstream fin("joc2020.in");
ofstream fout("joc2020.out");

const int R = 1 << 15;///radical din valoarea maxima a nr. din sir

bitset <1+R> c;
vector <int> prime;

void ciurul()
{
for (int i = 2; i * i <= R; i++)
{
if (!c[i])///daca i este prim
{
///parcurg multiplii sai
for (int multiplu = i * i; multiplu <= R; multiplu += i)
{
c[multiplu] = 1;///marchez multiplii ca nefiind nr. prime
}
}
}
///construiesc vectorul prime, cu prime[i]=al (i+1) lea nr. prim <= R
for (int i = 2; i <= R; i++)
{
if (!c[i])
{
prime.push_back(i);///il adaug pe i in vectorul de numere prime
}
}
}

int nr_divizori(int x)
{
int i = 0, nrd = 1;
///parcurg posibili div primi ai lui x din vectorul prime
while (i < prime.size() && prime[i] * prime[i] <= x)
{
if (x % prime[i] == 0)///daca am gasit un divizor prim
{
int p = 0;///calculez puterea la care apare in descompunere
while (x % prime[i] == 0)
{
p++;
x /= prime[i];
}
nrd *= (1 + p);///nr. divizorilor este produsul puterilor + 1
}
i++;
}
if (x != 1)///ultimul (cel mai mare) div. prim apare la 1 in desc. lui x
{
nrd *= 2;///inmultesc cu 2 = 1 + 1 rez. (nr. divizorilor)
}
return nrd;
}

int main()
{
int n;
ciurul();
fin >> n;

for (int i = 0; i < n; i++)


{
int x;
fin >> x;
int nrd = nr_divizori(x);
fout << nrd << " ";
}

fin.close();
fout.close();
return 0;
}
18. Unique
Dându-se un șir de numere naturale, să se determine câte dintre ele apar o singură dată.

#include <fstream>

using namespace std;

ifstream in ("unice.in");
ofstream out ("unice.out");

const int N = 100;

int v[N+1];

int main()
{
int n, x;
in >> n;
for(int i=1; i<=n; i++)
{
in >> x;
v[x]++;
}
for(int i=0; i<=n; i++)
{
if(v[i]==1)
out << i << " ";
}
in.close();
out.close();
return 0;
}

19. Cifre4
Se dau n numere naturale. Afișați cifrele care apar în scrierea zecimală a acestor numere, în ordinea crescătoare a numărului de apariții.
Dacă două cifre au același număr de apariții, se va afișa mai întâi cifra mai mică,

#include <iostream>

using namespace std;

const int VMAX = 9;

int nr[1+VMAX], cifra[1+VMAX];

int main()
{
int n;
///initializare a vectorului cifra
for (int i = 0; i <= VMAX; i++)
{
cifra[i] = i;
}
cin >> n;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
do
{
int cif = x % 10;
nr[cif]++;
x /= 10;
}
while (x != 0);
}
///elimin din ambii vectori cifrele cu zero aparitii
n = 0;///il voi refolosi pe n (va deveni numarul cifrelor care vor fi afisate)
for (int i = 0; i <= VMAX; i++)
{
if (nr[i] > 0)///cifra i trebuie pastrata (atat in vectorul nr, cat si in cifra)
{
nr[n] = nr[i];
cifra[n] = cifra[i];
n++;
}
}
///ordonez (simultan) vectorii nr si cifra (astfel incat pe nr[i] = nr. de ap. ale lui cifra[i])
for (int i = 0; i + 1 < n; i++)
{
int pmin = i;
for (int j = i + 1; j < n; j++)
{
if (nr[j] < nr[pmin] || (nr[j] == nr[pmin] && cifra[j] < cifra[pmin]))
///cifra[j] trebuie afisata inainte de cifra[pmin]
{
pmin = j;
}
}
if (pmin != i)
{
swap(nr[i], nr[pmin]);
swap(cifra[i], cifra[pmin]);
}
}
for (int i = 0; i < n; i++)
{
cout << cifra[i] << " ";
}
return 0;
}

20. MaxCif
Se dau mai multe numere naturale formate din exact o cifră. Determinaţi cifrele cu număr maxim de apariţii.

#include <fstream>

using namespace std;

ifstream in("maxcif.in");
ofstream out("maxcif.out");

const int N = 10;

int a[N];

int main()
{
int n, max=0;
while(in >> n)
{
v[n] ++;
if(v[n] > max)
{
max = v[n];
}
}

for(int i = 0; i <= 9; i++)


{
if(v[i]==max)
out << i << " ";
}

in.close();
out.close();
return 0;
}

21. PerechiSosete
Andrei lucrează într-un magazin de șosete, iar fiecare șosetă are asociat un numar întreg pentru a o identifica mai ușor din ce model face
parte. Dându-se un vector neordonat de astfel de coduri, aflați câte perechi de șosete se pot forma.

#include <iostream>
using namespace std;

const int N = 100;

int a[N+1];

int main()
{
int n;
cin >> n;
int x;
for(int i = 1 ; i <= n ; i++)
{
cin >> x;
a[x]++;
}
int cnt = 0;
for(int i = 1 ; i <= n ; i++)
{
cnt+=a[i]/2;
}
cout << cnt;
return 0;
}

22. SubNumar
Un număr natural x, format din exact două cifre, este numit sub-număr al unui număr natural y dacă cifrele lui x apar, în aceeași ordine, pe
ranguri consecutive, în numărul y.
Exemplu: 21 este sub-număr al lui 12145, al lui 213, al lui 21, dar nu și al lui 123 sau al lui 231.

Fișierul de intrare conține cel mult 1.000.000 de numere naturale. Se cere să se afișeze în fișierul de ieșire, în ordine descrescătoare, sub-
numerele care apar de cele mai multe ori în scrierea numerelor date.

#include <fstream>

using namespace std;

ifstream in("subnumar.in");
ofstream out("subnumar.out");

const int N = 100;

int v[N];

int main()
{
int k = 0, x;
for ( int i = 0 ; i < 100 ; i++ )
v[i] = 0;
while ( in >> x )
{
while ( x > 9 )
{
v[x % 100]++;
x /= 10;
}
k++;
}
int maxim = -1;
for (int i = 99 ; i >= 10 ; i--)
{
if ( maxim < v[i] )
maxim = v[i];
}
for (int i = 99 ; i >= 10 ; i--)
{
if (v[i] == maxim)
out << i << " ";
}
return 0;
}

23. Intervale5
Se dă un șir de cel mult un milion de numere naturale din intervalul [0,10 ]. Se cere să se determine toate perechile distincte formate din termeni ai
2

șirului dat, x și y (y-x≥2), astfel încât să nu existe niciun termen al șirului care să aparțină intervalului (x,y). Dacă nu există nicio astfel de pereche, se
afișează mesajul nu exista.

#include <fstream>

using namespace std;

ifstream in("intervale5.in");
ofstream out("intervale5.out");

const int N = 100;

int f[N+1];

int main()
{
int x;
int max=-1;
while(in >> x)
{
f[x]=1;
if(x > max)
max = x;
}
int cnt = 0;
for(int i = 0 ; i <= max - 2 ; i++)
{
for(int j = i + 2 ; j <= max ; j++)
{
bool ok = true;
for(int k = i + 1 ; k < j ; k++)
{
if(f[k]==1)
ok=false;
}
if(ok && f[i]==1 && f[j]==1)
{
out << i << " " << j << "\n";
}
cnt++;
}
}
if(!cnt)
out << "nu exista";
return 0;
}

24. NumarareCifre
Se dă un vector cu n numere naturale. Să se determine câte dintre perechile de elemente din vector au același număr de cifre.

#include <iostream>

using namespace std;

const int N = 200;

int v[N+1];

int main()
{
int n, x, y, s1=0, s2=0, cnt=0;
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> v[i];
for(int i = 1; i < n; i ++)
{
for(int j = i + 1; j <= n; j ++)
{
s1 = 0;
x = v[i];
while(x != 0)
{
s1 = s1 + x % 10;
x = x / 10;
}
s2 = 0;
y = v[j];
while(y != 0)
{
s2 = s2 + y % 10;
y = y / 10;
}
if(s1 == s2)
cnt ++;
}
}
cout << cnt;
return 0;
}

25. Puteri6
Se dă un număr natural n (1≤n≤10  ), și un șir cu cel mult 1000000 de elemente, numere naturale de forma 10  (0≤p≤9). Se cere să se afișeze numărul
6 p

care ar apărea pe poziția n în șirul ordonat crescător. Dacă șirul are mai puțin de n termeni, se afișează mesajul Nu exista.

#include <iostream>

using namespace std;

ifstream in("puteri6.in");
ofstream out("puteri6.out");

const int N = 10;

int f[N];

int main()
{
int n , x;
in >> n;
while(in >> x)
{
int p = 0;
while(x)
p++ , x/=10;
f[p-1]++;
}
for(int i = 0 ; i <= 9 && n != 0; i++)
{
for(int j = 1 ; j <= f[i] && n != 0; j++)
{
n--;
if(n==0)
out << pow(10 , i);
}
}
if(n > 0)
out << "Nu exista";

in.close();
out.close();
return 0;
}

26. Cifrazecmax
Se consideră un şir de cel puțin 11 şi cel mult un 10000 de numere naturale, despărțite prin câte un spațiu. Fiecare număr are cel puțin două şi cel mult
nouă cifre. Primul termen al şirului are numărul de ordine 1, al doilea are numărul de ordine 2 etc. Se citeşte şirul din fişier şi se cere să se determine
numărul de ordine al unui termen al şirului care este precedat în fişier de un număr maxim de valori care au cifra zecilor egală cu a sa. Dacă sunt mai
mulți termeni cu această proprietate se afişează numărul de ordine al primului.

#include <fstream>

using namespace std;

ifstream in("cifrazecmax.in");
ofstream out("cifrazecmax.out");

const int N = 10;

int fr[N];

#define frq fr[x/10%10]

int main()
{
int x, i=0, poz=0, maxi=0;
while(in >> x)
{
i++;
frq++;
if(frq > maxi)
{
maxi=frq;
poz=i;
}
}
out << poz;
in.close();
out.close();
return 0;

27. Eratostene 1
Se dau n numere naturale. Aflaţi câte dintre aceste numere sunt prime.

#include <fstream>

using namespace std;

ifstream in ("eratostene1.in");
ofstream out ("eratostene1.out");

const int N = 1000;

int v[N+1];

int main()

{
int n, s = 0;
in >> n;
for (int i = 0; i < n; i++)
in >> v[i];
bool prim = 1;
for (int i = 0; i < n; i++)
{
for (int j = 2; j <= v[i]/2; j++)
{
if (v[i] % j == 0)
prim = 0; break;
}
}
if (prim = 1)
s++;
out << s;
return 0;
}

28. Eratostene0
Vi se dau n perechi de numere naturale i j, cu i ≤ j. Pentru fiecare pereche trebuie să aflați suma divizorilor tuturor numerelor din șirul i, i +
1, ..., j.

#include <fstream>

using namespace std;

ifstream in("eratostene0.in");
ofstream out("eratostene0.out");

long long S[1000001];

int main()
{
int n;
in >> n;
S[1] = 1;
for(int i = 2; i <= 1000000; i++)
S[i] = i + 1;
for(int i = 2; i * i <= 1000000; i++)
{
S[i * i] = S[i * i] + i;
for(int j = i + 1; j * i <= 1000000; j++)
S[i * j] = S[i * j] + i + j;
}
for(int i = 1; i <= 1000000; i++)
S[i] += S[i-1];
int x, y;
for(int i = 1; i <= n; i++)
{
in >> x >> y;
out << S[y] - S[x-1] << "\n";
}
return 0;
}

29. Eratostene2
Se dau n numere naturale. Aflaţi pentru fiecare număr câţi factori primi are în descompunere.

#include <fstream>

using namespace std;

ifstream in("eratostene2.in");
ofstream out("eratostene2.out");

const int N = 500000;


int p[N+1], P;
bitset <1000000> e;

void eratostene()
{
e[0] = e[1] = 1;
for(int i = 2; i * i <= 10000; i++)
{
for(int j = i * i; j <= 10000; j += i)
e[j] = 1;
}
for(int i = 1; i <= 10000; i++)
if(!e[i])
p[++P] = i;
}

int desc(int n)
{
int d = 1;
int cnt=0;
while(n > 1)
{
int pi = 0;
while(n % p[d] == 0)
{
n/=p[d];
pi++;
}
if(pi)
cnt++;
d++;
if(n > 1 && p[d] * p[d] > n)
{
cnt++;
break;
}
}
return cnt;
}

int main()
{
int n;
eratostene();
in >> n;
for(int i = 1; i <= n; i++)
{
int x;
in >> x;
out << desc(x) << " ";
}
return 0;
}

30. Eratostene3
Se dau n numere naturale. Aflaţi pentru fiecare număr dat x, câte numere naturale nenule mai mici sau egale cu x sunt prime cu x?

#include <fstream>

using namespace std;

ifstream in("eratostene3.in");
ofstream out("eratostene3.out");

const int N = 1000000


int E[N+1], n;
long long int t;

int main()
{
cin >> n;
for(int i = 1; i <= 1000000; ++i)
E[i] = i - 1;
E[1] = 1;
for(int i = 2; i <= 1000000; ++i)
for(int j = 2 * i; j <= 1000000; j = j + i)
E[j] = E[j] - E[i];
for(int i = 1; i <= n; ++i)
{
int x;
cin >> x;
cout << E[x] << " ";
}

in.close();
out.close();
return 0;
}

31. Eratostene4
Se dau n numere naturale. Pentru fiecare număr aflaţi câţi divizori liberi de pătrate are acesta.

#include <fstream>

using namespace std;


ifstream in("eratostene4.in");
ofstream out("eratostene4.out");

const int MAX = 10000000;


bool ciur[MAX];
int nrDiv[MAX];
void CIUR()
{
memset(ciur, 1, MAX);
for (int i = 2; i * i < MAX; i++)
if (ciur[i])
for (int j = i * i; j < MAX; j += i)
ciur[j] = 0;

for (int i = 2; i < MAX; i++)


if (ciur[i])
for (int j = i; j < MAX; j += i)
nrDiv[j]++;
}
int main()
{
CIUR();
int n;
in >> n;
for (int i = 1; i <= n; i++)
{
int var;
in >> var;
out << (1 << nrDiv[var]) << " ";
}

in.close();
out.close();
return 0;
}

32. SecvEgale1_2
Se dă un vector cu n elemente, numere naturale. Determinați cea mai lungă secvență de elemente din vector care începe și se termină cu aceeași
valoare. Dacă în vector există mai multe secvențe corecte de lungime maximă se va determina cea mai din stânga.

#include <iostream>

using namespace std;

const int N = 1000;

int a[N+1];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];

int st = 0, dr = 0, lmax = 0;
for(int i = 1; i <= n; i++)
{
int l = 0;
for(int j = i; j <= n; j++)
{
if(a[j] == a[i])
l = j - i + 1;
}
if(l > lmax)
{
lmax = l;
st = i;
dr = i + l - 1;
}
}

cout << st << " " << dr;


return 0;
}

33. Soft_Prime
Se dă un şir format din n numere naturale nenule distincte. Afişaţi numerele prime din şir, în ordine crescătoare.

#include <fstream>

using namespace std;

ifstream in("platou2.in");
ofstream out("platou2.out");

int main()

{
int n, a, k, len, b;
in >> n >> a;
len=1; k=1; b=a;
for (int i=2; i<=n; i++)
{
f >> a;
if (a>b)
len++;
else
{
if (len>k)
k=len;
len=1;
}
b=a;
}
if (len>k)
{
k=len;
}
out << k;

return 0;
}

34. Ciurul Lui Eratosthenes 


Să se afișeze numerele prime de la 1 la n.

#include <isotream>

using namespace std;

bool c[1000001];
int x = 1000001;

void ciur()
{
c[1]=c[0]=1;
for(int i = 2 ; i * i <= x ; i++)
for(int j = 2 ; i * j <= x ; j++)
c[i*j]=1;
}

int main()
{
int n;
cin >> n;
ciur();
for(int i = 1 ; i <= n ; ++i)
if(c[i]==0)
cout << i << " ";
return 0;
}
35. prim013
Dorel este pasionat de feng shui. Astfel, pentru a-şi crea un cadru adecvat meditaţiei, s-a hotărât să scrie pe pereţii casei numere care au un număr
prim de divizori. El a găsit n numere, însă nu ştie să le aleagă pe cele potrivite.

#include <fstream>

using namespace std;

ifstream in("prim013.in");
ofstream out("prim013.out");

int prim(int n)
{
if(n == 0 || n == 1)
return 0;
if(n == 2)
return 1;
if(n % 2 == 0)
return 0;
for(int i = 3 ; i * i <= n ; i += 2)
if(n % i == 0)
return 0;
return 1;
}
int nrdiv(int n)
{
int d = 2 , prod = 1;
while(n > 1)
{
int p = 0;
while(n % d == 0) {n /= d; p++;}
if(p)
prod = prod * (p+1);
d++;
if(d * d > n)
d =n;
}
return prod;
}
int main()
{
int n , x , cnt = 0;
in >> n;
for(int i = 1 ; i <= n ; i++)
{
in >> x;
if(x != 1 && prim(nrdiv(x)))
cnt++;
}
out << cnt;
in.close();
out.close();
return 0;
}

36. Numere1
Se dau n umere naturale. Deteminaţi cele mai mari două umere cu trei cifre care nu apar printre numerele date.

#include <iostream>
#include <bitset>

using namespace std;

const int VMAX = 1000;

bitset <VMAX> c;//se comporta la fel ca bool c[VMAX], dar foloseste cate un bit pentru fiecare element
//deci de 8 ori mai putina memorie

int main()
{
int n, x;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
if (x < VMAX)
{
c[x] = 1;
}
}
int a = 0, b = 0;
x = VMAX - 1;
while (x >= VMAX / 10 && b == 0)
{
if (!c[x])//x nu a fost citit, deci nu apartine sirului dat
{
if (a == 0)
{
a = x;
}
else
{
b = x;
}
}
x--;
}
if (b == 0)//am gasit cel mult un numar lipsa
{
cout << "NU EXISTA";
}
else
{
cout << b << " " << a;
}
return 0;
}

37. Cifrqe7
e dau nnumere naturale. Afișați cifrele care apar în scrierea zecimală a acestor numere, în ordinea crescătoare a numărului de apariții. Dacă
două cifr au același număr de apariții, se va afișa mai întâi cifra mai mică,

#include <iostream>

using namespace std;

const int VMAX = 9;

int nr[1+VMAX], cifra[1+VMAX];

int main()
{
int n;
///initializare a vectorului cifra
for (int i = 0; i <= VMAX; i++)
{
cifra[i] = i;
}
cin >> n;
for (int i = 0; i < n; i++)
{
int x;
cin >> x;
do
{
int cif = x % 10;
nr[cif]++;
x /= 10;
}
while (x != 0);
}
///elimin din ambii vectori cifrele cu zero aparitii
n = 0;///il voi refolosi pe n (va deveni numarul cifrelor care vor fi afisate)
for (int i = 0; i <= VMAX; i++)
{
if (nr[i] > 0)///cifra i trebuie pastrata (atat in vectorul nr, cat si in cifra)
{
nr[n] = nr[i];
cifra[n] = cifra[i];
n++;
}
}
///ordonez (simultan) vectorii nr si cifra (astfel incat pe nr[i] = nr. de ap. ale lui cifra[i])
for (int i = 0; i + 1 < n; i++)
{
int pmin = i;
for (int j = i + 1; j < n; j++)
{
if (nr[j] < nr[pmin] || (nr[j] == nr[pmin] && cifra[j] < cifra[pmin]))
///cifra[j] trebuie afisata inainte de cifra[pmin]
{
pmin = j;
}
}
if (pmin != i)
{
swap(nr[i], nr[pmin]);
swap(cifra[i], cifra[pmin]);
}
}
for (int i = 0; i < n; i++)
{
cout << cifra[i] << " ";
}
return 0;
}

38. Cunt2
Se dă un vecor cu n nuere naturale. Să se determine câte dintre perechile de elemente din vector sunt formate din valori cu aceeași sumă a cifrelor.

#include <iostream>

using namespace std;

int suma_cifre (int nr)


{
int S=0;
do
{
int cif = nr%10;
S += cif;
nr = nr/10;
}
while (nr!=0);
return S;
}

int comb_de_n_cate2 (int n)


{
int comb = n*(n-1)/2;
return comb;
}

int main()
{
int n, x, vec_suma[82]={0}, nr_perechi=0;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
int SC = suma_cifre (x);
vec_suma[SC]++;
}
for (int i=0; i<82; i++)
if (vec_suma[i] > 1)
{
//cout << i << " " << vec_suma [i] << " ";
int per_suma_i = comb_de_n_cate2 (vec_suma[i]);
nr_perechi = nr_perechi + per_suma_i;
}
cout << nr_perechi << "\n";
return 0;
}

40. Cifrerd
Se dau n cifre zecimal. Să se afişez aceste cifre în ordine crescătoare.

#include <fstream>

using namespace std;

const int VMAX = 10;


const int LIN = 20;

int nr[VMAX];

int main()
{
ifstream in("cifreord.in");
ofstream out("cifreord.out");
int n;
in >> n;
for (int i = 0; i < n; i++)
{
int cif;
in >> cif;
nr[cif]++;
}
in.close();
int lin = 0;
for (int i = 0; i < VMAX; i++)//parcurgem valorile posibile in ordine crescatoare
{
for (int j = 0; j < nr[i]; j++)//scriem i de nr[i] ori
{
out << i;
lin++;
if (lin == LIN)
{
out << "\n";
lin = 0;
}
else
{
out << " ";
}
}
}
out.close();
return 0;
}

41. Numere 8
Se dă o listă cu numere naturale. Să se determine numerele naturle nenule cu cel mult patru cifre care nu apar în lista dată.

#include <fstream>
#include <bitset>

using namespace std;

const int VMAX = 10000;

bitset <VMAX> c;//se comporta la fel ca bool c[VMAX], dar foloseste cate un bit pentru fiecare element
//deci de 8 ori mai putina memorie

int main()
{
ifstream in("numere8.in");
ofstream out("numere8.out");
int x;
while (in >> x)
{
if (x < VMAX)
{
c[x] = 1;
}
}
in.close();
x= VMAX - 1;
while (x > 0)
{
if (!c[x])//x nu a fost citit, deci nu apartine sirului dat
{
out << x << " ";
}
x--;
}
out.close();
return 0;
}

43. Sum_Chef
Fiind dat un şir cu n elemente numereaturale, să se calculeze suma cuburilor cifrlor tuturor numerelor din şir.

#include <iostream>

using namespace std;

const int VMAX = 10;


int frecv_cifre[VMAX];

int cubul_lui_n (int n)


{
int cub = n*n*n;
return cub;
}

int main()
{
int n, x, cif;
long long S=0 ;
cin >> n;
for (int i=0; i<n; i++)
{
cin >> x;
while (x!=0)
{
cif = x%10;
frecv_cifre[cif]++ ;
x = x/10;
}
}
for (cif=0; cif<VMAX; cif++)
if (frecv_cifre[cif]>0)
{
S = S + cubul_lui_n (cif) * frecv_cifre[cif] ;
}
cout << S;
return 0;
}

44. NrLipsa3
Fișieul de intrare conține cel puțin 3 și cel mult 1.000.000 de numere naturale. Se cere să se afișze în fișierul de ieșire, separate printr-un spaţiu, două
numere distincte, anume el mai mic număr par cu două cifre și cel mai are număr par cu ouă cifre care NU fac parte din şir.

#include <fstream>

#include <bitset>

using namespace std;

const int VMAX=99;


const int VMIN=10;

ifstream in("nrlipsa1.in");
ofstream out ("nrlipsa1.out");

bitset <VMAX+1> apartine;

int main()
{
int nr;
while(in >> nr)
if(nr >= VMIN && nr <= VMAX)
apartine [nr]=1;
int p = -1, u = -1;
for(int i = VMIN ; i <= VMAX; i += 2)
{
if(apartine[i] == 0)
{
if (p==-1)
p = i;
u=i;
}
}
if (p!=u)
out << p << " " << u;
else
out << "nu exista";
in.close();
out.close();
return 0;
}

45. prim023
Dorel a scris un ir format din n numere naturale nenule. Apoi a luat fiecare subşir şi a calculat produsul termenilor săi. Aflaţi câte dintre produsele
efectuate sunt numere prime.

#include <fstream>

using namespace std;

ifstream cin("prim023.in");
ofstream cout("prim023.out");

int E[35005], prime[6001], nrp;

int prim(int n)
{
if(n == 0 || n == 1)
return 0;
if(n == 2)
return 1;
if(n % 2 == 0)
return 0;
for(int i = 1 ; prime[i] * prime[i] <= n && i <= nrp ; i ++)
if(n % prime[i] == 0)
return 0;
return 1;
}

int main()
{
int n , cnt = 0 , p = 0 , x , c = 1 , a[10001];
cin >> n;

for(int i = 2 ; i < 35000 ; i++)


E[i] = 1;
for(int i = 2 ; i < 35000 ; i++)
if(E[i] == 1)
{
prime[ ++ nrp] = i;
for(int j = i * i; j < 35000; j += i)
E[j] = 0;
}
for(int i = 0 ; i < n ; i++)
{
cin >> x;
if(prim(x)) cnt++;
if(x==1) p++;
}
while(cnt)
{
a[c]=cnt%10;
c++;
cnt/=10;
}
c--;
for(int i = 1; i <= p ; i++)
{
int t = 0;
for(int j = 1; j <= c ; j++)
{
int cif=a[j]*2+t;
a[j] = cif % 10;
t=cif/10;
}
while(t)
{
a[++c]=t%10;
t/=10;
}
}
for(int i = c ; i >= 1 ; i--)
cout << a[i];
if(c==0)
cout << c;

cin.close();
cout.close();
return 0;
}

46. Eratostene0
Vi se dau n perechi de numere naturae i j, cu i ≤ j. Pentru fiecare pereche trebuie să aflați suma divizorilor tuturor numerelor din șirul i, i +
1, ..., j.

#include <fstream>

using namespace std;

ifstream in("eratostene0.in");
ofstream out("eratostene0.out");
long long S[1000001];

int main()
{
int n;
in >> n;
S[1] = 1;
for(int i = 2; i <= 1000000; i++)
S[i] = i + 1;
for(int i = 2; i * i <= 1000000; i++)
{
S[i * i] = S[i * i] + i;
for(int j = i + 1; j * i <= 1000000; j++)
S[i * j] = S[i * j] + i + j;
}
for(int i = 1; i <= 1000000; i++)
S[i] += S[i-1];
int x, y;
for(int i = 1; i <= n; i++)
{
in >> x >> y;
out << S[y] - S[x-1] << "\n";
}
return 0;
}

47. Intervale01
Se dă un șir de cel mult un milion de numere naturale din intervalul [0,10 ]. Se cere să se determine toate perechile distincte formate din termeni ai
2

șirului dat, x și y (y-x≥2), astfelncât să nu existe niciun termen al șirului care să aparțină intervalului (x,y). Dacă nu există nicio astfel de pereche, se
afișează mesajul nu exista.

#include <fstream>

using namespace std;

ifstream in("intervale5.in");
ofstream out("intervale5.out");

const int N = 100;

int f[N+1];

int main()
{
int x;
int max=-1;
while(in >> x)
{
f[x]=1;
if(x > max)
max = x;
}
int cnt = 0;
for(int i = 0 ; i <= max - 2 ; i++)
{
for(int j = i + 2 ; j <= max ; j++)
{
bool ok = true;
for(int k = i + 1 ; k < j ; k++)
{
if(f[k]==1)
ok=false;
}
if(ok && f[i]==1 && f[j]==1)
{
out << i << " " << j << "\n";
}
cnt++;
}
}
if(!cnt)
out << "nu exista";
return 0;
}

48. Cifrazecmax
Se consideră un şir de cel puțin 11 şi cel mult un 10000 de numere naturale, despărțite prin câte un spațiu. Fiecare număr are cel puțin două şi cel mult
nouă cifre. Primul termen al şirului are numărul de ordine 1, al doilea are numărul de ordine 2 etc. Se citeşte şirul din fişier şi se cere să se determine
numărul de ordine al unui termen al şirului care este precedat în fişier de un număr maxim de valori care au cifra zecilor egală cu a sa. Dacă sunt mai
mulți termeni cu această proprietate se afişează numărul de ordine al primului.

#include <fstream>

using namespace std;

ifstream in("cifrazecmax.in");
ofstream out("cifrazecmax.out");

const int N = 10;

int fr[N];

#define frq fr[x/10%10]

int main()
{
int x, i=0, poz=0, maxi=0;
while(in >> x)
{
i++;
frq++;
if(frq > maxi)
{
maxi=frq;
poz=i;
}
}
out << poz;

in.close();
out.close();
return 0;

49. cntcoloane
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine câte coloane ale matricei au elementele distincte două câte două.

#include <iostream>

using namespace std;

const int N = 100;

int a[N][N];

int main()
{
int nl, nc;
///citirea matricei
cin >> nl >> nc;
for (int i = 0; i < nl; i++)
{
for (int j = 0; j < nc; j++)
{
cin >> a[i][j];
}
}
///calculul rezultatelor
int nr_c = 0;
for (int j = 0; j < nc; j++)///parcurgem coloanele
{
bool distincte = true;
for (int i1 = 0; i1 < nl; i1++)
{
for (int i2 = i1 + 1; i2 < nl; i2++)
{
if (a[i1][j] == a[i2][j])///coloana j NU are toate elementele distincte
{
distincte = false;
}
}
}
if (distincte)
{
nr_c++;
}
}
cout << nr_c;
return 0;
}

50. eratostene
Se dau n numere naturale mai mici decât 1.000.000. Determinaţi câte dintre ele sunt prime.

#include <fstream>
using namespace std;

ifstream in("eratostene.in");
ofstream out("eratostene.out");

const int NMAX = 1000000;

bitset <NMAX + 1> ciur;

void Ciur()
{
//int j = 0;
for (int i = 2; i * i <= NMAX; i++) {
if (ciur[i] == false) {
for (int multiplu = i * i; multiplu <= NMAX; multiplu += i) {
ciur[multiplu] = true;
}
}
}
}

int main()
{
Ciur();
int n, cate = 0;
in >> n;
for (int i = 1; i <= n; i++) {
int v;
in >> v;
if (!ciur[v])
{
cate++;
}
}
out << cate << "\n";
in.close();
out.close();
return 0;
}

51. Divizori4
Gigel a găsit un șir cu n numere naturale, numerotate de la 1 la n și un număr p. Neavând chef de muncă, Gigel vă cere să rezolvați următoarele
cerințe:

a) Câți divizori are numărul din șir aflat pe poziția p?


b) Care sunt numerele din șir care au același număr de divizori ca cel aflat pe poziția p?

#include <fstream>
#include <bitset>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

const int R = 1 << 15;///radical din valoarea maxima a nr. din sir

// a<<b for integers means "shift left". The bitwise representation of a is shifted left b bits.
// This is the same as multiplying by (2 to the power of b).
// so in your example, (1<<1) is 1*(2^1) is 2, (1<<8) is 1*(2^8) is 256.
// Deci 1 << 15 este 1*(2^15), radical din (2^30) act e val max a nr din sir: 2 mld ~ 2^31, tipul int
bitset <1+R> c;
vector <int> prime, v; // Vector is a dynamic array and, doesn’t needs size declaration.
// https://www.edureka.co/blog/vectors-in-cpp/
void ciurul()
{
for (int i = 2; i * i <= R; i++)
{
if (!c[i])///daca i este prim
{
///parcurg multiplii sai
for (int multiplu = i * i; multiplu <= R; multiplu += i)
{
c[multiplu] = 1;///marchez multiplii ca nefiind nr. prime
}
}
}
///construiesc vectorul prime, cu prime[i]=al (i+1) lea nr. prim <= R
for (int i = 2; i <= R; i++)
{
if (!c[i])
{
prime.push_back(i);///il adaug pe i in vectorul de numere prime
}
}
}

int nr_divizori(int x)
{
int i = 0, nrd = 1;
///parcurg posibili div primi ai lui x din vectorul prime
while (i < prime.size() && prime[i] * prime[i] <= x)
{
if (x % prime[i] == 0)///daca am gasit un divizor prim
{
int p = 0;///calculez puterea la care apare in descompunere
while (x % prime[i] == 0)
{
p++;
x /= prime[i];
}
nrd *= (1 + p);///nr. divizorilor este produsul puterilor + 1
}
i++;
}
if (x != 1)///ultimul (cel mai mare) div. prim apare la 1 in desc. lui x
{
nrd *= 2;///inmultesc cu 2 = 1 + 1 rez. (nr. divizorilor)
}
return nrd;
}

int main()
{
ifstream in("divizori4.in");
ofstream out("divizori4.out");
ciurul();
int n, cerinta, p;
in >> n >> cerinta;
v.resize(n);///aloc. memorie pentru un vector de n elemente
for (int i = 0; i < n; i++)
{
in >> v[i];
}
in >> p;
p--;
if (cerinta == 1)
{
out << nr_divizori(v[p]);
}
else
{
int nrd = nr_divizori(v[p]);
sort(v.begin(), v.end(), greater<int>());///ordonez descrescator v ; despre asta la https://www.geeksforgeeks.org/sorting-
a-vector-in-c/
for (int i = 0; i < n; i++)
{
if (nr_divizori(v[i]) == nrd)
{
out << v[i] << " ";
}
}
}
in.close();
out.close();
return 0;
}

S-ar putea să vă placă și