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();}

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

Indicaie: Se calculeaz suma b d y , unde a,b,c,d sunt datele de intrare, apoi se


x

simplific fracia y , folosind procedeul de mai sus.


#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
(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;
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++)
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 divizori"<<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>
#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;
5

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