Se citeşte un număr natural n. Să se scrie un algoritm eficient care afișează toți divizorii numărului n.
Un număr natural d este divizor al lui n dacă și numai dacă n%d=0 (n se împarte exact la d sau, altfel spus, restul împărțirii lui n la d este egal cu 0).
Dacă d este un divizor al lui n, atunci și n/d este un divizor. Aceasta se datorează faptului că dacă n se împarte exact la d, rezultatul q=n/d este și el un divizor al lui n.
Datorită faptului că divizorii unui număr apar în perechi și că unul din fiecare pereche este întotdeauna mai mic sau egal cu radical(n), este suficient să căutăm divizorii unui număr până la radical(n).
Fie n=36. Divizorii săi sunt:
1,2,3,4,6,9,12,18,36
Observăm că:
1×36=36
2×18=36
3×12=36
4×9=36
6×6=36 (în acest caz, 6 este exact radical(36))
De aici se observă că pentru fiecare divizor d mai mic decât radical(36), există un divizor 36/d mai mare decât radical(36). Când ajungem la radical(n), divizorul se va repeta dacă n este un pătrat perfect (cum este cazul lui 6 pentru n=36)
n,d întreg
citeşte n
pentru d ← 1, sqrt(n) execută
| dacă n % d = 0 atunci
| | scrie d
| | dacă d != n/d atunci
| | scrie n/d
| |▄
|▄
/**************************************************************
divizorii unui numar - metoda eficienta
***************************************************************/
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n;
cout << "Introduceti un numar: ";
cin >> n;
cout << "Divizorii numarului " << n << " sunt: ";
for (int d = 1; d <= sqrt(n); d++) {
if (n % d == 0) {
cout << d << " "; // d este un divizor
if (d != n / d) {
cout << n / d << " "; // n / d este un alt divizor
}
}
}
cout << endl;
return 0;
}