Divizorii elementelor unei matrici

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
mircea2011
Junior
Junior
Posts: 27
Joined: 11 Aug 2011, 23:12
Judet: Olt

Divizorii elementelor unei matrici

Post by mircea2011 » 19 Aug 2011, 22:26

Se citeste o matrice cu n linii si m coloane avand elementele numere naturale. Sa se inlocuiasca fiecare element din matrice cu numarul sau de divizori.
[nu reusesc sa determin divizorii fiecarui element al matricii]
multumesc.

#include<stdio.h>
#include<math.h>
void main()
{
int n, m, A[20][20], i, j, d, div;
printf("\n Introduceti numarul de linii n = "); scanf("%d", &n);
printf("\n Introduceti numarul de coloane m = "); scanf("%d", &m);
printf("\n Introduceti elementele matricii : \n");
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++)
{
printf("\n A[%d][%d] = ", i, j);
scanf("%d", &A[j]);
}
}
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
for(d=1; d<=A[j]; d++)
{
div = 0;
if(A[j] % d ==0)
div++;
A[j] = div;
}
}
}
printf("\n Matricea cu numarul de divizori ai fiecarui element : \n");
for(i=1; i<=n; i++) {
for(j=1; j<=n; j++)
{
printf("\n A[%d][%d] = %d\n", i, j, div);
}
}
}



Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Divizorii elementelor unei matrici

Post by Viorel » 19 Aug 2011, 22:43

Încearcă să modifici un ciclu interior:

Code: Select all

div = 0;
for(d = 1; d <= A[i][j]; d++)
{
    if(A[i][j] % d == 0) div++;
}
A[i][j] = div;
Apropo, numerotarea elementelor în C++ începe de la zero, iar ciclurile for(i=1; i<=n; i++) de obicei se scriu aşa: for(i=0; i<n; ++i).

mircea2011
Junior
Junior
Posts: 27
Joined: 11 Aug 2011, 23:12
Judet: Olt

Re: Divizorii elementelor unei matrici

Post by mircea2011 » 20 Aug 2011, 22:48

Multumesc pentru sfat, dar din pacate nu functioneaza.
Am incercat un alt cod :
div = 0;
for(d=1; d<=A[j]; d++)
{
if(A[j] % d ==0)
div++;
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++)
A[j] = div;
}
}

care la randul lui nu functioneaza.

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Divizorii elementelor unei matrici

Post by bu7ch3r » 22 Aug 2011, 09:39

Sa analizam bucata aste de cod, pe care o vom transforma sau nu intr-o functie.
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++) {
for(d=1; d<=A[j]; d++)
{
div = 0;
if(A[j] % d ==0)
div++;
A[j] = div;
}

Nu e nevoie sa incepi de la 0 cu indexi lui i si j pentru ca am vazut ca scri tot de la 1. Ca nota ar trebui sa sti ca un int a[10] are 10 elemente care incep de la 0 si se termina la 9. Daca o sa faci ceva de genul a[20] = 10 o sa crape...

for(d=2; d<=A[j]; d++)
divizorii unui numar dupa o regula stabilita de cineva merg de la 1 la numar/2 (in cazu nostru 2) sau de la 1 la sqrt(numar).... deci a<=A[j] ar tb sa fie a <= a[j]/2 in prima faza. castigi 50% complexitate asa.

d = 1 e un pas in plus toate numerele se impart la 1 si la numarul insusi; ca efect div ar trebui sa fie din prima 2 si sa incepi for-ul de la 2;

A[j] = div nu are rost, pentru ca se face atribuirea de fiecare data in for. E de ajuns sa faci div++ si dupa ce iesi din for sa muti A[j] = div;

O alta problema grava e ca tu in for faci de fiecare data div = 0; Initializare lui div ar trebui(defapt TREBUIE!) facuta inainte de forul cu detectie;

In final bucata ta de cod ar tb sa fie:

for(i = 1; i <= n; i++)
{
for(j = 1; j <=m ; j++)
{
div = 2;
int nStopCondition = (int)A[j]/2; // ca sa nu faci impartirea de fiecare data
/* poti sa testezi daca este diferenta intre int nStopCondition = (int) sqrt(A[j]); */

for(d = 2; d <= nStopCondition; d++)
{
if( A[i][j] % d == 0)
div++;
}
A[i][j] = div;
}
}
Last edited by bu7ch3r on 22 Aug 2011, 16:29, edited 1 time in total.
Cu stima,
Lupu Claudiu

User avatar
bu7ch3r
Membru++
Membru++
Posts: 326
Joined: 17 May 2011, 15:17
Judet: Iaşi
Location: Sofia
Contact:

Re: Divizorii elementelor unei matrici

Post by bu7ch3r » 22 Aug 2011, 09:44

mircea2011 wrote:Multumesc pentru sfat, dar din pacate nu functioneaza.
Am incercat un alt cod :
div = 0;
for(d=1; d<=A[j]; d++)
{
if(A[j] % d ==0)
div++;
for(i=1; i<=n; i++) {
for(j=1; j<=m; j++)
A[j] = div;
}
}

care la randul lui nu functioneaza.


Normal ca nu functioneaza, tu dai la toata matricea valoarea lui div ... Nu e bine... Ce IDE folosesti? Daca ai face step by step debug ai putea sa observi aceste probleme. Inainte sa inveti sa faci step by step debug ar trebui sa faci "foaie si creion" debug. Succes!
Cu stima,
Lupu Claudiu

Post Reply