Sunteți pe pagina 1din 6

Algoritul lui Euclid

1. a) Se dau dou numere naturale, nenule. S sescrie o funcie care calculeaza cel
mai mare divizor comun al lor i cel mai mic multiplu comun.
b) Considernd cele dou numere ca fiind numrtorul i numitorul unei fracii, s
se simplifice fracia astfel nct s se aduc la o form ireductibil.

Exemplu: date de intrare 12 32


date de ieire cmmdc=4 cmmmc=96
fractia simplificata este 3/8

Procedeu:

a) Se imparte numrul mai mare la numrul mai mic i, att timp ct restul este
diferit de 0, dempritul este nlocuit de mpritor, iar mpritorul este nlocuit de
rest. Ultimul rest diferit de 0, n aceast succesiune de mpriri reprezint cel mai
mare divisor comun. Cel mai mic multiplu comun se calculeaz dup relaia :
produsul numerelor este egal cu produsul ntre cel mai mare divisor comun i cel mai
mic multiplu comun.
b) Pentru simplificare, se ambele numere impart numerele la cmmdc i se rein
rezultatele.

#include <iostream.h>
#include <conio.h>
int cmmdc(int a,int b){
int r,aux;
if (a<b){
aux=a;a=b;b=aux;}
r=a%b;
while (r>0){
a=b;b=r;r=a%b;}
return b;
}
void main(){
int m,n;
cout << "m="; cin >>m;
cout << "n="; cin >>n;
cout<<"cel mai mare divizor comun intre "<<m<<" si "<<n<<" este"<<
cmmdc(m,n) <<endl;
cout<<"cel mai mic multiplu comun intre "<<m<<" si "<<n<<" este"<<
m*n / cmmdc(m,n) << endl;
cout<<"fractia simplificata este "<< m/cmmdc(m,n)<<"/"<< n/cmmdc(m,n)
<< endl;
getch();}

1
2. Se citesc de la tastatur patru numere ntregi, diferite de 0. Numerele reprezint,
n ordinea citirii, numrtorul i numitorul a primei fracii, respectiv numrtorul
i numitorul unei a doua fracii.
Exemplu: date de intrare 6 18 12 24
date de ieire :suma fractiilor a/b si c/d este 5/6
a c x
Indicaie: Se calculeaz suma + = , unde a,b,c,d sunt datele de intrare, apoi se
b d y
x
simplific fracia , folosind procedeul de mai sus.
y
#include <iostream.h>
#include <conio.h>
int cmmdc(int a,int b){
int r,aux;
if (a<b){
aux=a;a=b;b=aux;}
r=a%b;
while (r>0){
a=b;b=r;r=a%b;}
return b;
}
void main(){
int a,b,c,d,x,y;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
cout << "c="; cin >>c;
cout << "d="; cin >>d;
x=a*d+b*c;
y=b*d;
cout<<"suma fractiilor "<<a<<"/"<<b<<" si "<<c<<"/"<<d<<" este "
<<x/cmmdc(x,y) <<"/"<< y/cmmdc(x,y)<<endl;
getch();}

3. Intr-o organizaie sunt b1 brbai i f1 femei. Se organizeaz o


activitate la care trebuie s participe un numr ct mai mare de
echipe, formate din acelai nrb brbai i nrf femei, n fiecare
echip. S se scrie un program care determin numrul maxim de
echipe care se pot forma i numrul nrb de brbai, respectiv
numrul nrf de femei, din componena fiecrei echipe. Dac nu se
pot forma cel puin dou echipe identice, s se afieze mesajul
Imposibil.

Exemple: pentru b1=10 f1=15 se va afia 5 echipe cu 2 barbati 3 femei


pentru b1=12 f1=25 se va afisa Imposibil.

Rezolvare: Fiind vorba de constituirea unor echipe avnd acelai


numr de membri brbai, respectiv femei, numrul ecestor echipe
trebuie s fie divizor al lui b1 i al lui f1. Avnd de calculat
numrul maxim de echipe care se pot forma, problema se reduce la a
calcula cel mai mare divizor comun al lui b1 i f1. Pentru a calcula
numrul de brbai, respectiv numrul de femei din fiecare echip

2
(nrb i nrf), se mpart, pe rnd, b1 i f1 la cel mai mare divizor
comun al lor.

#include <iostream.h>
#include <conio.h>
int cmmdc(int a,int b){
int r,aux;
if (a<b){
aux=a;a=b;b=aux;}
r=a%b;
while (r>0){
a=b;b=r;r=a%b;}
return b;
}
void main(){
int b1,f1,nrb,nrf;
cout << " Numarul de barbati:"; cin >>b1;
cout << "Numarul de femei:"; cin >>f1;
if (cmmdc(b1,f1)!=1){cout<<"Numarul maxim de echipe este:"<<
cmmdc(b1,f1);
nrb=b1/cmmdc(b1,f1);
nrf=f1/cmmdc(b1,f1);
cout<<",fiecare1 echipa avand "<<nrb<<" barbati si "<<nrf<<"
femei"<<endl;}
else
cout<<"Imposibil";
getch();
}

4. Se dau trei numere naturale a,b,c. Determinai i afiai cel mai


mare divizor comun al lor.

Exemplu: Date de intrare: a=12 b=32 c=38 Date de ieire : 2

Rezolvare:
Se are n vedere c cmmdc(a,b,c)=cmmdc(cmmdc(a,b),c). Implementarea
n C++ este urmtoarea:

#include <iostream.h>
#include <conio.h>
int cmmdc(int a,int b){
int r,aux;
if (a<b){
aux=a;a=b;b=aux;}
r=a%b;
while (r>0){
a=b;b=r;r=a%b;}
return b;}
void main(){
int a,b,c;
cout << "a="; cin >>a;
cout << "b="; cin >>b;
cout << "c="; cin >>c;

3
cout<<"cmmdc intre "<<a<<" "<<b<<" si "<<c<<" este
"<<cmmdc(cmmdc(a,b),c);
getch();}
5. Se d un numr natural n. S se afieze toate numerele mai mici
dect n, prime cu n.
Exemplu: Date de intrare: n=10
Date de ieire:1 3 7 9

Rezolvare: Se parcurg numerele mai mici dect n i se afl cel mai


mare divizor comun ntre n i numrul parcurs. Dac este egal cu 1,
se afieaz.

#include <iostream.h>
#include <conio.h>
int cmmdc(int a,int b){
int r,aux;
if (a<b){
aux=a;a=b;b=aux;}
r=a%b;
while (r>0){
a=b;b=r;r=a%b;}
return b;}
void main(){
int n,i;
cout << "n="; cin >>n;
for (i=1;i<n;i++)
if (cmmdc(i,n)==1) cout << i<<endl;getch();}

Operaii cu numere prime

1. a) S se defineasc o funcie care verific dac un numr n este prim sau nu i s se


apeleze pentru un numr n, preluat de la tastatur.
b) S se afieze numerele prime mai mici dect n.
c) S se afieze divizorii primi ai lui n.
Exemple: n=11 date de ieire 11 este prim. numere prime mai mici decat 11 sunt 2 3 5 7;
10 nu are divizori
n=10 date de ieire 10 nu este prim. numere prime mai mici decat 10 sunt 2 3 5
7; divizorii primi ai lui 10 sunt 2 5
Rezolvare: Se definete o variabil p, care ia valoarea 1, dac numrul este prim i 0,
dac nu este prim. Iniial, se consider c numrul este prim i se iniializeaz p cu 1. Se
parcurg apoi numerele pn la jumtatea lui n (divizorii posibili ai lui n i, dac unul din
numerele parcurse l divide pe n, p devine 0.

#include <iostream.h>
#include <conio.h>
int prim(int a){
int p=1,i;
for (i=2;i<=a/2;i++)

4
if (a%i==0) p=0;
return p;};
void main(){
int n,k;
cout<<"n="; cin>>n;
/*rezolvare punctul a */
if (prim(n)==1) cout<<n<<" este prim"<<endl;
else cout<<n<<" nu este prim"<<endl;
cout<<"Numerele prime mai mici decat "<<n<<" sunt: ";
/*rezolvare punctul b */
for (k=2;k<n;k++) if (prim(k)==1) cout<<k<<" ";
cout<<endl;
/*rezolvare punctul c */

if (prim(n)) cout<<n<<" nu are alti divizori primi afara de "<<n


<<endl;
else {
cout<<"divizorii primi ai lui "<<n<<" sunt: ";
for (k=2;k<n;k++) if (
n%k==0) if (prim(k)==1) cout<<k<<" ";}
getch();
}

2. Se d un numr natural n. s se genereze primele n numere prime.


Exemplu n=7 va afia primele 7 numere prime sunt: 2 3 5 7 11 13 17.

#include <iostream.h>
#include <conio.h>
int prim(int a){
int p=1,i;
for (i=2;i<=a/2;i++)
if (a%i==0) p=0;
return p;};
void main(){
int n,k=0,x=2;
cout<<"n="; cin>>n;
while (k<n) {if (prim(x)) {cout<<x<<" "; k++;};
x++;};
getch();}

3. Pentru un numr n, preluat de la tastatur, s se afieze


descompunerea acestuia n factori primi.

Exemplu: n=24 va afia : 2 la puterea 3


3 la puterea 1

Rezolvare: Factorii primi ai lui n sunt toi mai mici dect


radicalul acestuia. Prin urmare, se parcurg numerele de la 2 la radical
din n i dac numrul parcurs este prim, se calculeaz de cte ori
apare n decompunerea lui n (variabila exp). Radicalul unui numr se
obine apelnd funcia sqrt, din fiierul header math.h.

#include <iostream.h>

5
#include <conio.h>
#include <math.h>
int prim(int a){
int p=1,i;
for (i=2;i<=a/2;i++)
if (a%i==0) p=0;
return p;};
void main(){
int m,n,k,exp;
cout<<"n="; cin>>n;m=n;
for (k=2;k<=sqrt(m);k++){
if (prim(k)){ exp=0;
while ((n%k)==0)
{n=n/k; exp++;};
if (exp>0)
cout<<k<<" la puterea "<<exp<<endl;}}
getch();}

S-ar putea să vă placă și