Testul de primalitate
Un număr e prim dacă nu are alți divizori în afară de 1 și el însuși.
Nu e nevoie să testezi până la . E suficient până la , pentru că divizorii vin în perechi: dacă divide , atunci și divide , iar unul dintre ei e mereu .
Complexitate: de la la .
Cazuri speciale: 0 și 1 nu sunt prime. 2 e singurul număr prim par.
Divizorii unui număr
Aceeași observație: parcurgi de la 1 la și pentru fiecare divizor găsit adaugi și perechea lui.
Algoritmul lui Euclid
Calculează cel mai mare divizor comun (cmmdc).
Varianta cu scăderi: cât timp , scade din cel mare pe cel mic. Când devin egale, aia e valoarea.
Varianta cu împărțiri (mult mai rapidă):
Repeți până restul devine 0. Ultimul rest nenul e răspunsul.
Exemplu: cmmdc(48, 18):
- 48 mod 18 = 12 → (18, 12)
- 18 mod 12 = 6 → (12, 6)
- 12 mod 6 = 0 → răspuns 6
Cel mai mic multiplu comun
Atenție la depășire: la numere mari, poate depăși tipul. Se împarte întâi: .
Greșeli frecvente
- Se consideră 1 număr prim. Nu este.
- Se testează divizibilitatea până la în loc de . Corect, dar mai lent; la limite mari pică pe timp.
- La cmmmc se înmulțește întâi și se depășește tipul. Împarte întâi.
Alege limbajul în care dai examenul. Poți edita codul și îl poți rula direct aici. Programa oficiala de BAC (proba E.d) cere Pascal sau C/C++, la alegere. Python apare in manualele noi si e pus aici pentru inteles, nu ca limbaj de examen.
#include <iostream>
using namespace std;
int cmmdc(int a, int b) {
while (b != 0) {
int r = a % b;
a = b;
b = r;
}
return a;
}
bool prim(int n) {
if (n < 2) return false;
for (int d = 2; d * d <= n; d++)
if (n % d == 0) return false;
return true;
}
int main() {
int a, b;
cin >> a >> b;
int d = cmmdc(a, b);
cout << "cmmdc=" << d << " cmmmc=" << (a / d) * b << " ";
cout << a << (prim(a) ? " prim" : " neprim");
return 0;
}