Laborator 1 1) Să se scrie un program cu ajutorul căruia să se găsească cel mai mare divizor comun a două numere întregi pozitive a şi b. #include <iostream> long cmmdc (long x, long y) long rest; do rest = x%y; x = y; y = rest; while (rest!=0); return x; void main() long a,b,c; char raspuns; do cout<<"\ndati doua numere intregi pozitive -->"<<endl; cin>>a>>b; cout<<"\ncmmdc("<<a<<","<<b<<")="; if (b>a) c = a; a = b; b = c; cout<<cmmdc(a,b)<<endl; cout<<"\ncontinuati? d)a n)u -->"; cin>>raspuns; while (raspuns!='n'); 2) Să se scrie un program care pentru două numere întregi a şi b găseşte două numere întregi m şi n pentru care are loc relaţia d=m*a+n*b unde d=cmmdc(a,b). #include<iostream> void main() int a,b,q,r,x0=1,x1=0,y0=0,y1=1; cout<<"\ndati doua numere intregi pozitive -->"<<endl; cout<<"a="; cin>>a; cout<<"\nb="; cin>>b; int copy_a=a,copy_b=b; while(b)
r=b; q=a/b; b=a%b; a=r; r=x1; x1=x0-q*x1; x0=r; r=y1; y1=y0-q*y1; y0=r; cout<<"\ncel mai mare divizor comun al celor doua numere este "<< a <<" iar scrierea acestuia ca o combinatie liniara a celor doua numere este:"<<endl; //urmeaza afisarea rezultatului cout<<a<<"="; if(x0<0) cout<<"("<<x0<<")"; cout<<x0; cout<<"*"<<copy_a<<"+"; if(y0<0) cout<<"("<<y0<<")"; cout<<y0; cout<<"*"<<copy_b<<endl; 3) Să se scrie un program cu ajutorul căruia să se afle inversul numărului întreg k în Z n. #include<iostream> #include<conio.h> int modulo(int k, int n)//extindem operatorul modulo (%) si pentru numere negative if(k<0)k=n-(-k)%n; if(k>=n) return k%n; return k; int invers(int a,int n) int q,r,x0=1,x1=0,copy_n=n; a=modulo(a,n); while( n!=0) r=n; q= a/n; n= a%n; a=r; r=x1;
x1=x0-q*x1; x0=r; if(a==1)//daca numarul este inversabil return modulo(x0,copy_n); return -1;//daca numarul nu este inversabil, vom intoarce -1, pentru a putea afisa mesajul corespunzator void main() int k,n; cout<<"proramul va calcula inversul unui numar k in Zn."; cout<<"\nn="; cin>>n; cout<<"\nk="; cin>>k; int temp=invers(modulo(k,n),n); if(temp==-1) cout<<"\nnumarul nu este inversabil!"<<endl; cout<<"\ninversul lui "<<k<<" in Z"<<n<<" este "<<invers(k,n)<<endl; getch(); 4) Să se scrie un program cu ajutorul căruia să se determine inversa unei matrice cu două linii şi două coloane cu elemente din Zn. 5) Să se scrie un program cu ajutorul căruia să se calculeze valoarea unui determinant de un ordin dat. 6) Să se scrie un program care determină inversa unei matrice cu elemente numere reale. //calcul matrice inversa #include <iostream> #include<conio.h> void main() int i,j,l,n; float a[100][200],d=1; cout<<"dati ordinul matricei-->"; cin>>n; cout<<"\ndati elementele matricei\n"; cin>>a[i][j]; for(j=n+1;j<=2*n;j++) if(i==(j-n)) a[i][j]=1; a[i][j]=0;
for(i=1;(i<=n)&&(d!=0);i++) for(j=i;(j<=n)&&(a[j][i]==0);j++); if(j>n) d=0; if(j>i) for(l=1;l<=2*n;l++) a[i][l]+=a[j][l]; if(a[i][i]!=1) for(l=2*n;l>=1;l--) a[i][l]/=a[i][i]; if(j!=i) for(l=2*n;l>=i;l--) a[j][l]-=a[j][i]*a[i][l]; if(d==0) cout<<"\nmatricea nu este inversabila!!!"; cout<<"\nmatricea inversa este:\n"; cout<<a[i][n+j]<<" "; cout<<endl; getch(); 7) Folosind eventual funcţiile calcul_minor şi calcul_det descrise mai jos să se scrie un program cu ajutorul căruia să se determine inversa unei matrice pătratice cu elemente din Zn. Algoritmul de la problema anterioară poate fi folosit in acest caz? int** calcul_minor(int **matrice,int lin,int col,int n) /*calculeaza minorul corespunzator pentru lin, col din matricea matrice*/ int i,j,**a=new int *[n-1]; for(i=0;i<n-1;i++) a[i]=new int[n-1]; for(i=0;i<n-1;i++) for(j=0;j<n-1;j++) if(i<lin) if(j<col) a[i][j]=matrice[i][j]; a[i][j]=matrice[i][j+1]; if(j<col) a[i][j]=matrice[i+1][j]; a[i][j]=matrice[i+1][j+1];
return a; int calcul_det(int** matrice,int n) /*calculeaza valoarea determinantului matricei matrice*/ if(n<=1) return matrice[0][0]; int S=0; for(int i=0;i<n;i++) S+=matrice[0][i]*(i%2?-1:1)*calcul_det(calcul_minor(matrice,0,i,n),n-1); return S;