Documente Academic
Documente Profesional
Documente Cultură
Maxime și minime
Determinarea minimului
Să rezolvăm următoarea problemă: Se dau n numere întregi. Calculaţi cel mai
mic dintre cele n numere date.
• inițializăm min cu prima dintre cele n valori; celelalalte n-1 valori se vor
compara cu min
• inițializăm min cu o valoare foarte mare; fiecare dintre cele n valori citite se
va compara cu min. Alegerea valorii inițiale a lui min depinde de restricțiile
problemei; pentru problema #n_minim poate fi 1.000.000.000.
min = x[1];
for(int i =2 ; i <= n ; i ++)
{
if(x[i] < min)
min = x;
}
Rezolvare:
Program C++:
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int ogl= 0;
while(n){
ogl =10*ogl + n%10;
n /= 10;
}
cout << ogl << endl;
return 0;
}
Divizibilitate
o Divizorii unui număr
• 1 în pereche cu 36
• 2 în pereche cu 18
• 3 în pereche cu 12
• 4 în pereche cu 9
• 5 nu este divizor al lui 36
• 6 în pereche cu 6. 6 trebuie luat o singură dată!
• 7*7>36, ne oprim!
#include <iostream>
Using namespace std;
int main()
{
int n;
cin >> n;
for(int d =1 ; d * d <= n ; d ++ )
if(n % d == 0)
{
cout << d << " ";
if(d * d < n) // dacă d != sqrt(n)
std :: cout << n / d << " ";
}
return 0;
}
Definiții
Fie aa și bb două numere naturale. Un număr natural dd se numește cel mai
mare divizor comun (pe scurt cmmdc) al lui aa și bb dacă îndeplinește
condițiile:
1. d|ad|a și d|bd|b;
2. dacă c|ac|a și c|bc|b, atunci c|dc|d.
Proprietăți cmmdc
Cel mai mare divizor comun al numerelor naturale are proprietățile:
1. ((a,b),c)=(a,(b,c)),∀a,b,c∈N((a,b),c)=(a,(b,c)),∀a,b,c∈N
2. (a,b)=1,(a,c)=1⇒(a,bc)=1(a,b)=1,(a,c)=1⇒(a,bc)=1
3. a|bc și (a,b)=1⇒a|ca|bc și (a,b)=1⇒a|c
4. a|c,b|c și (a,b)=1⇒ab|ca|c,b|c și (a,b)=1⇒ab|c
• Cât timp numerele sunt diferite, se scade numărul mai mic din numărul mai
mare.
• Când numerele devin egale, valoare comună este cel mai mare divizor
comun al valorilor inițiale.
• Algoritmul nu poate fi aplicat dacă unul dintre numere este 0. De ce?
Exemplu:
Program C++:
#include <iostream>
int main()
{
int n , m;
cin >> n >> m;
while(n != m)
if(n > m)
n -= m;
else
m -= n;
cout << n << std :: endl;
return 0;
}
• Cât timp m != 0:
o Determinăm restul împărțirii lui n la m.
o În continuare n devine m, iar m devine restul calculat.
• Valoarea actuală a lui n este cel mai mare divizor comun a valorilor inițiale.
Exemplu:
Program C++:
#include <iostream>
int main()
{
int n , m;
cin >> n >> m;
while(m != 0)
{
int r = n % m;
n = m;
m = r;
}
cout << n << std :: endl;
return 0;
}
Determinarea cmmmc
Pentru a determina cel mai mic multiplu comun se pot folosi mai multe metode:
a⋅b=(a,b)⋅[a,b]a⋅b=(a,b)⋅[a,b]
a⋅b=gcd(a,b)⋅lcm(a,b)a⋅b=gcd(a,b)⋅lcm(a,b)
1. inițial n ← a, m ← b;
2. cât timp m != n:
o dacă m < n, atunci m crește cu valoarea lui a: n ← n + a
o dacă m > n, atunci n crește cu valoarea lui b: m ← m + b
3. valoarea finală, comună, a lui n și m este cel mai mic multiplu comun
pentru a și b
Observație: Algoritmul poate fi aplicat similar pentru trei sau mai multe numere!
Verificare primalității
Definiții
Un număr natural p>1p>1 este se numește prim dacă:
p|ab⇒p|a sau p|bp|ab⇒p|a sau p|b
Un număr natural p>1p>1 este se numește indecompozabil (sau ireductibil) dacă:
d|p⇒d=1 sau d=pd|p⇒d=1 sau d=p
Observații
• Pentru orice număr natural p>1p>1, pp este prim dacă și numai dacă este
indecompozabil.
• Cei doi divizori ai unui număr indecompozabil (prim)sunt 1 și însuși
numărul.
• Conform definiției, numerele 0 și 1 nu sunt prime!
• Un număr natural mai mare decât 1 care nu este prim se
numește compus sau decompozabil sau reductibil.
Verificarea primalității
Pentru a stabili dacă un număr p este prim:
Program C++:
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n;
int d = 2, // d va fi, pe rand, fiecare factor prim din descompunere
p; // p va fi puterea lui d in descompunere
// il im partim pe n la d in mod repetat, pana cand devine 1
while(n > 1)
{
// numaram de cate ori se imparte n la d. Aceasta va fi puterea lui d
in descompunere
p = 0;
while(n % d == 0)
{
++p;
n /= d;
}
// daca s-a facut cel putin o impartire, afisam factorul si puterea
if(p)
cout << d << " " << p << endl;
++ d;
// daca d * d il depaseste pe n si n nu este 1, decidem ca n este
prim,
// si este factor in descompunerea valorii initiale a lui n
if(n>1 && d * d > n){
d = n; // trecem direct la n, urmatorul factor din descompunere
}
}
return 0;
}
Numerele Fibonacci sunt numere naturale care fac parte din următorul șir, în care
fiecare număr este egal cu suma celor două de dinainte:
Fn = Fn-1 + Fn-2
a ← 1
b ← 1
scrie a, b
pentru i ← 3,n execută
c ← a + b
scrie c
a ← b
b ← c
sfarsit_pentru
Baze de numeratie
orice număr natural b mai mare decât 1 poate fi considerat bază de numerație, iar
cifrele folosite în baza b sunt 0, 1, 2, …, b-1. În contextul computerelor sunt
utilizate frecvent bazele 10, 2, 8 și 16. Să le analizăm:
24:212:26:23:21:2=12 rest 0=6 rest 0=3 rest 0=1 rest 1=0 rest 124:2=12 rest
012:2=6 rest 06:2=3 rest 03:2=1 rest 11:2=0 rest 1
Secvența C++ de mai jos determină cea mai mare cifră a reprezentării în baza b a
numărului n.
cmax = 0;
cin >> n >> b;
while(n)
{
int cif= n % b;
if(cif > cmax)
cmax = cif;
n /= b;
}
Transformarea din baza b în baza 10
Pentru transformarea numărului ckck−1…c1c0(b)ckck−1…c1c0(b) din baza b în
baza 10 folosim
formula ckck−1…c1c0(b)=ck⋅bk+ck−1⋅bk−1+…+c1⋅b+c0ckck−1…c1c0(b)=ck⋅bk+c
k−1⋅bk−1+…+c1⋅b+c0, în care operațiile de adunare, înmulțire și ridicare la putere
se fac în baza 10. De fapt această formulă este echivalentă cu reprezentarea
zecimală a numerelor, de
exemplu: 253(10)=2⋅102+5⋅101+3⋅100253(10)=2⋅102+5⋅101+3⋅100.
Exemplu
11000(2)=1⋅24+1⋅23+0⋅22+0⋅21+0⋅20=1⋅16+1⋅8=16+8=2411000(2)=1⋅24+1⋅23+
0⋅22+0⋅21+0⋅20=1⋅16+1⋅8=16+8=24