Sunteți pe pagina 1din 3

Prof.

Mihaela Corina ILDEGEZ


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

Obiective:
Descompunere in factori primi
Determinare cmmdc
Algoritmi elementari Determinare cmmmc
Aplicații

Corectarea temei: #376, #387, #388, #1568, #389, #408, #64, #1574, #45, #375

Descompunere în factori primi


Orice număr natural nenul, care nu este număr prim poate fi scris ca un produs de numere
naturale prime și această descompunere este unică. Scrierea unui număr natural ca un produs de
numere naturale prime se numește descompunere în factori primi a numărului natural respectiv.
Exemplu: daca x=24200 atunci descompunerea lui în factori primi este:
24200 22 *52
242 2
121 11
11 11
1
Deci 242000 = 23 * 52 * 112
Programul este:
#include <fstream>
using namespace std;
ifstream fin("numar.in");
ofstream fout("factori.out");
int main()
{ int x, d=2,p,;
fin>>x;
while(d*d<=x)
{p=0; //puterea factorului d
while(x % d==0)
{
x=x/d;
p++;
}
if(p)
fout<<d<<” ”<<p<<endl;
d++;
}
return 0;
}
Determinare cmmdc(a,b) și cmmmc(a,b)
Din punct de vedere matematic, cel mai mare divizor comun a două numere naturale a și
b este un număr natural d, care:
 divide și pe a și pe b;
 este divizibil cu orice divizor a lui a și b(este maximal în raport cu această
proprietate.
Pentru a afla cel mai mare divizor comun al două sau mai multor numere naturale mai mari
decât 1, matematic se procedează astfel:
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță ”Hai la Olimpiadă” - Suceava
 se descompun numerele în factori primi
 se iau toți factorii primi comuni, o singură dată, la puterea cea mai mică și se
înmulțesc între ei.
Exemplu:
Dacă a = 420 atunci descompunerea în factori primi este 420=22*3*5*7 și dacă b = 504
atunci descompunerea în factori primi este 504=23*32*7, de unde rezultă că cel mai mare divizor
comun dintre cele două numere, notat cmmdc(420, 504)= 22*3*7=84
Pentru a scrie un algoritm care determină valoarea celui mai mare divizor comun dintre două
numere după modelul matematic de determinare este destul de complicat. Există algoritmi mai simpli
pentru realizarea acestui lucru:

Algoritmul lui Euclid: Folosind operația de împărțire(eficient)


Se citesc cele două numere naturale a și b, iar în situația în care a nu este mai mare decât b
se interschimbă valorile celor două variabile. Se împarte a la b până la obținerea unui rest egal cu
zero. Dacă restul obținut în urma împărțirii lui a la b nu este zero atunci valoarea lui b va fi transferată
în variabila a, valoarea restului va fi transferat în b si se va relua algoritmul prin calcularea restului
împărțirii a la b, dar cu noile valori ale variabilelor a și b. Valoarea celui mai mare divizor comun dintre
a și b, notată cmmdc(a, b) , va fi egală cu ultimul rest diferit de zero(care va fi păstrat în variabila b)
Programul este:
#include <iostream>
using namespace std;

int main()
{
int a,b,r;
cin>>a>>b;
if(a==0 and b==0)
cout<<"-1";
else
{
if(a==0)cout<<b;
else
if(b==0)cout<<a;
else
{
if(a<b)
swap(a,b);
r=a % b;
while(r)
{
a=b;
b=r;
r=a % b;
}
cout<<b;
}
}
return 0;
}
Două sau mai multe numere naturale care au cel mai mare divizor comun al lor egal cu 1 se
numesc numere prime între ele.
Matematic, cel mai mic multiplu comun a două numere naturale a și b este un număr natural
m, care:
 este multiplu al lui a și al lui b;
 se divide cu orice multiplu al numerelor a și b.
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță ”Hai la Olimpiadă” - Suceava
Cel mai mic multiplu comun dintre două numere naturale a și b, notat cmmmc(a, b) se
calculează cu relația:
𝑎∗𝑏
cmmmc(a, b)=𝑐𝑚𝑚𝑑𝑐(𝑎,𝑏)

Sau alt algoritm care determină valoarea cmmmc(a, b) prin adunări repetate este:

#include <fstream>
using namespace std;
ifstream fin("numere.in");
ofstream fout("cmmdc.out");
int main()
{int a, b, r, aux;
fin>>a>>b;
if(a<b) ///numarul a trebuie sa fie cel mai mare
{aux=a;a=b;b=aux;}
r=a;
while(r%b!=0) ///adun repetat la rezultat numarul mai mare pana se divide cu numarul mai mic b
r=r+a;
fout<<r;
return 0;
}

De rezolvat in clasa: #58, #59, #60,#411,#2611

Tema acasă:
 Ușoare: #390,
 Medie: #409, #490,#305,#378

P1. Frăția inelelor:


Pământul de mijloc (un domeniu de dimensiune N X N ca
în figură) din Frăția Inelelor trebuie apărat de forțele exterioare
ale răului. Tânărul hobbit Frodo Baggins Frodo împreună cu
frăția formată din hobbiți, oameni, un vrăjitor, un gnom și un
elf, trebuie să ducă inelul la Muntele de Foc, unde a fost creat
și să îl distrugă pentru totdeauna. Inelul este păstrat în zona
marcată cu albastru. În jurul inelului, pe trei culoare patrulează
permanent trei soldați care încep patrularea din colțul stânga
sus în același moment (poziția inițială). Cei trei soldați (garda) se
vor schimba cu alți trei soldați în momentul în care ajung în
poziția inițială, simultan. Soldații patrulează în sensul acelor de
ceasornic fiecare cu aceeași viteză constantă, și fiecare pe
culoarul său ca în figură(soldatul S1 patrulează pe culoarul
galben, soldatul S2 pe verde și soldatul S3 pe roșu. Cu albastrul este marcat Pământul din mijloc care
trebuie apărat).
Cerință:
Să se implementeze un program care determină numărul de circuite complete pentru fiecare
soldat (un circuit complet este făcut de un soldat oarecare, pe același culoar până ajunge în poziția
inițială), pentru schimbarea gărzii. )
Date de intrare: din fișierul text cetate.in se citește o valoare naturala N care reprezintă
dimensiunea totală a domeniului(zona care trebuie apărata și cele trei culoare pe care circulă soldații)
Date de ieșire: în fișierul text ture.out trei numere naturale t1, t2, t3 care reprezintă numărul
de circuite complete pentru fiecare soldat până în momentul în care schimbă garda.
Restricții: N număr impar mai mare sau egal cu 7