Tablou bidimensional - cmmdc de pe fiecare coloana C++

Cerinta: se da un tablou bimensional de max 100 elemente(10x10).Sa se afiseze cel mai mare divizor comun de pe fiecare coloana.
Cum am incercat sa rezolv:

  • aici e functia pentru cmmdc :
int cmmdc(int a, int b) {
   int r=a%b;
   while(r) {
       a=b;
       b=r;
       r=a%b;
   }
   return b;
}

Aici e ceea ce am incercat(matricea e deja “incarcata” cu elemente) :

int pos;
    for(i=0;i<dimensiune;i++) {
            pos=matrice[0][i];
        for(j=1;j<dimensiune;j++) {
        pos=cmmdc(pos,matrice[j][i]);
        cout<<pos<<endl;
        }
        cout<<"coloana "<<i+1<<" cmmdc: "<<pos<<endl;
    }
  • variabila dimensiune e dimensiunea tabloului(4 de ex)
  • variabila pos memoreaza numarul de la prima linie,fiecare coloana pe rand( [0][0] [0][1] etc ) iar apoi calculeaza divizorul comun dintre el si urmatorul element
  • in al doilea for coloana ramane fixata si creste doar parametrul liniei,de asta am pus [j][i]
  • dupa ce termina cu toate “coloanele” (col) de pe prima linie trece la un urmatorul set de coloane
  • variabila j din for incepe de la 1 deoarece elementul zero este deja in variabila pos si nu cred ca are rost sa fac divizorul comun a doua numere identice

Problema este ca merge pentru primul set de coloane dar apoi apare ca programul nu mai functioneaza.

Am facut si o schita in caz ca ajuta.
schita

2 Likes

salut,
O sa incerc o explicatie cat mai “didactica” posibil:
incearca intai sa faci o parcurgere a matricei pe coloane si ca sa fii sigur ca merge testeaza cu afisare. Adica afiseaza numerele de pe coloana.
dupa ce esti sigur ca parcurgi corect, pentru a calcula cmmdc al tuturor numerelor de pe o coloana trebuie sa calculezi cmmdc al primelor doua, rezultatul il vei folosi calculand cmmdc dintre acesta si urmatorul numar … si asa mai departe.
matricea initiala
pentru matricea din imagine si cmmcd elementelor de pe prima coloana calculezi un cmmdc in variabila x=cmmdc(a11,a21) si in continuare x=cmmdc(x,a31), x=cmmdc(x,a41) si x=cmmdc(x,a51).
Toate astea le poti face in parcurgerea ta pe coloane.
Spor la treaba!

1 Like

+1 pentru exemplul detaliat. Cum se manifesta mai exact faptul că nu merge? Rămâne blocat undeva, sau arata outpit greșit?

Pai asa calculez cmmdc,dintre primele 2 numere,apoi rezultatul cu al treilei numar si tot asa,pos e primul numar si se calculeaza cmmdc dintre el si urmatorul numar de pe coloana,variabila j tot creste iar rezultatul din pos se tot calculeaza cu urmatorul numar(testeaza cmmdc cu urmatorul numar ca sa zic asa)

Dupa ce parcurge prima coloana(a11,a21,a31 etc) si calculeaza cmmdc apare ca programul nu mai functioneaza

adica se blocheaza programul?

for(i=0;i<n;i++) {
        pos=x[0][i];
        for(j=1;j<m;j++) {
        pos=cmmdc(pos,x[j][i]);
        }
        cout<<"coloana "<<i+1<<" cmmdc: "<<pos<<endl;
    }

mie pe un gcc imi merge… pentru o matrice mai micuta, intr-adevar

2 4 6
5 4 6
8 6 5
coloana 1 cmmdc: 1
coloana 2 cmmdc: 2
coloana 3 cmmdc: 1

Am testat si eu si pare sa mearga.
http://cpp.sh/7sxr

Sigur ai initializat cum trebuie matricea?

Merge daca citesc eu matricea de la tastatura,inainte o cititeam din fisier(chiar daca nu cere in enunt),asta era problema.