Sunteți pe pagina 1din 3

Prof.

Mihaela Corina ILDEGEZ


Centru pentru pregătire pentru Performanță ”Hai la Olimpiadă” - Suceava

Obiective:
Determinare divizori
Determinare divizori proprii
Divizibilitate Verificare număr prim
Aplicații

Instrucțiunea for

Instrucțiunea for este o structură repetitivă cu număr necunoscut de pași și test final:

Pseudocod Instrucțiune C++

pentru i=vi pânâ la vf cu pasul x cu pas pozitiv:


instrucțiune; for(i = vi; i <= vf; i = i+x)
sfârșit_pentru instructiune;
Unde: sau cu pas negativ:
vi valoare inițială for( i = vi; i >= vf; i = i-x)
vf valoare finală instructiune;
x valoarea pasului(cu cât creste/scade i la fiecare repetare)
Mod de execuție:

1. Se evaluează expresia de Inițializare: i=vi


2. Se evaluează expresia de Testare: i<=vf sau i>=vf în funcție de valoarea pasului
3. Dacă expresia de Testare este nenulă:
o Se execută Instrucțiune;.
o Se evaluează expresia de Continuare: i=i+x sau i=x-x.
o Se revine la pasul 2.
4. Dacă expresia de Testare este nulă, se trece la instrucțiunea de după for.

DIVIZIBILITATE. NUMERE PRIME

De la matematică putem spune că un număr natural d este divizorul lui x, dacă și numai dacă,
restul împărțirii lui x la d este egal cu zero:
dacă x % d = 0 atunci
scrie d „îl divide pe” x
altfel
scrie d „nu îl divide pe ” x
sfârșit_dacă
Dacă d divide pe x, spunem că d este divizor al lui x, iar x este multiplu al lui d. Dacă vom nota
cu Dn mulțimea divizorilor numărului x, atunci pentru numărul x = 12 putem scrie:
D12={1, 2, 3, 4, 6, 12},
unde 1 și 12 se numesc divizori improprii ai lui x, iar 2, 3, 4, 6 sunt divizorii proprii ai numărului dat.

Algoritmul pentru determinarea(afișarea) divizorilor unui număr n dat, care respectă


definițiile de mai sus este:
1. citește numărul x (număr natural)
2. pentru fiecare posibil divizor d∈ [1, 𝑥/2] execută
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță ”Hai la Olimpiadă” - Suceava
dacă d este divizorul lui x atunci
afișează divizorul d
sfârșit_dacă
sfârșit_pentru
3. afișează și pe x pentru că și el însuși este divizor

Algoritmul de mai înainte este corect, dar neeficient. Testați-l pentru


n = 1.000.000.000
și veți vedea că execuția durează 2-3 secunde. Poate nu pare mult, dar dacă lucrăm cu 1000 de
numere cu valori în jurul lui 1.000.000.000, execuția poate dura aproximativ 45 de minute – prea
mult!
Soluția acceptabilă este să observăm că divizorii oricărui număr x sunt în pereche: dacă d este
divizor al lui x, atunci și x/d este divizor al lui x.
De exemplu, pentru n = 75.
● 1 este divizor 75, atunci și 75/1 = 75 este divizor al lui 75;
● 2 nu este divizor al lui 75
● 3 este divizor 75, atunci și 75/3 = 25 este divizor al lui 75;
● 4 nu este divizor al lui 75
● 5 este divizor 75, atunci și 75/5 = 15 este divizor al lui 75;
● 6 nu este divizor al lui 75
● 7 nu este divizor al lui 75
● 8 nu este divizor al lui 75
● 9 nu este divizor al lui 75. Mai mult, 9 * 9 > 75, alți divizori nu vom mai găsi.

Deci divizorii lui 75 sunt: {1, 75, 3, 25, 5, 15}. Constatăm astfel că pentru a determina divizorii
lui x este suficient să parcurgem numerele de la 1 la √𝑥. Un caz special îl constituie pătratele
perfecte. În cazul lor trebuie evitată analizarea de două ori a lui x si √𝑥 , care este divizor al lui x.
Pentru x=36 avem divizorii:
1. 1 în pereche cu 36
2. 2 în pereche cu 18
3. 3 în pereche cu 12
4. 4 în pereche cu 9
5. 5 nu este divizor al lui 36
6. 6 în pereche cu 6. Atenție! 6 trebuie luat o singură dată!
7. 7*7>36, ne oprim!
Noua variantă a algoritmului care afișează divizorii lui x este:
citește x (număr natural) #include <fstream>
using namespace std;
pentru fiecare posibil divizor de la 1 la [√𝑥] execută ifstream fin("numar.in");
dacă d este divizorul lui x atunci ofstream fout("divizori.out");
afișează divizorul d int main()
{int x;
dacă d<[√𝑥] atunci //evităm afișare dublată a lui x, dacă x este
//pătrat perfect
fin>>x;
for(int d=1;d*d<=x; d++)
afișează perechea divizorului d: x/d if(x % d==0)
sfârșit_dacă {fout<<d<<” ”;
sfârșit_dacă if(d*d<x)
fout<<x/d<<” ”;
sfârșit_pentru }
return 0;
}
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță ”Hai la Olimpiadă” - Suceava

Atenție! Pentru determinarea și prelucrarea divizorilor proprii ai unui număr este nevoie să
modificăm intervalul de căutare a posibililor divizori din interval închis [1, √𝑥] în intervalul [2, √𝑥],
fără a lua în considerare numărul însuși.
Prelucrarea divizorilor proprii ai lui x în funcție de cerința din problemă:
1. citește x (număr natural)
2. pentru fiecare posibil divizor de la 2 la [𝑥/2] execută
dacă d este divizor propriu lui x atunci
prelucrarea divizorului propriu determinat
sfârșit_dacă
sfârșit_pentru

Relații matematice cu divizori:


● Numărul de numere <=n divizibile cu k este : nr_div_k = n/k
● Numărul de numere din [a, b], divizibile cu k este: nr_div_k = b/k – (a-1)/k
● Numărul de multipli de a și multipli de b din [1,n] = n/cmmmc(a, b)
● Numărul de multipli de a care nu sunt multipli de b din [1,n]este:
n/a-n/cmmmc(a, b)
Numere prime
Un număr natural care are exact doi divizori se numește număr prim, iar numerele naturale care nu
sunt numere prime se numesc numere compuse. Sau un număr natural este prim dacă nu are nici un
divizor propriu.
Programul este:
#include <fstream>
using namespace std;
ifstream fin("numar.in");
ofstream fout("prim.out");
int main()
{
int x, prim;
fin>>x;
if(x<2)
fout<<'0';
else
{ int d=2;
prim=1;
for(d=2;d*d<=;d++)
if(x % d==0)
prim=0;
fout<<prim;
}
return 0;
}
Rezolvați următoarele probleme de pe site-ul pbinfo.ro
#376, #387, #388, #1568, #389
Tema acasă:
#408, #64, #1574, #45, #375