calculer la sum des diagonales dans une masortingce

J’ai besoin de calculer la sum de deux diagonales dans une masortingce en C ++, j’ai déjà une solution à cela, mais je dois être bête parce que je ne comprends pas ce que ça fait, alors j’aimerais savoir s’il existe une autre version que je peux comprendre. voici le code qui fait le travail:

cout<<"Jepi rangun e matrices"<>n; cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica for(i=1;i<=n;i++) { for(j=1;j>a[i][j]; } d=0; s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j) d=d+a[i][j]; if(j==n-i+1 || i==n-j+1) s=s+a[i][j]; } 

La partie difficile à comprendre est

 if(j==n-i+1 || i==n-j+1) s=s+a[i][j]; 

Voici le code entier que j’ai changé mais cela ne fonctionne pas pour la diagonale secondaire:

 #include  using namespace std; int main() { int d=0,s=0; // ketu e keni kushtin si dhe mbledhjen per te dy diagonalet me dy variabla te ndryshme int i,j,n; int a[5][5]; cout<<"Jepi rangun e matrices"<>n; cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica for(i=1;i<=n;i++) { for(j=1;j>a[i][j]; } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) d+=a[i][j]; //principal diagonal if(i+j==n-1) s+=a[i][j];//secondary diagonal } } cout << d << endl; cout << s << endl; cin.get(); cin.get(); return 0; } 

Ce serait bien d’avoir des commentaires en anglais, mais votre code fait (deuxième boucle):

 browse all rows browse all cells if i == j (is in main diagonal): increase one sum if i == n - i + 1 (the other diagonal) increase the second sum 

Le code beaucoup plus beau et beaucoup plus efficace (en utilisant n , au lieu de n^2 ) serait:

 for( int i = 0; i < n; i++){ d += a[i][i]; // main diagonal s += a[i][ni-1]; // second diagonal (you'll maybe need to update index) } 

Cela va directement à travers les diagonales (les deux à la même boucle!) Et ne va pas à travers d'autres éléments.

MODIFIER:

La diagonale principale a les coordonnées {(1,1), (2,2), ..., (i,i)} (donc i == j ).

La diagonale secondaire a les coordonnées (dans la masortingce 3x3): {(1,3), (2,2),(3,1)} qui est en général: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)} . Mais en C, les tableaux sont indexés à partir de 0, pas 1, vous n'aurez donc pas besoin de +1 (probablement).

Tous les éléments en diagonale secondaire qui doivent être en condition: i == n - j + 1 (à nouveau en raison de l'indexation de C de 0 +1 passe à -1 ( i=0, n=3 , j=2 , j = n - i - 1 )).

Vous pouvez réaliser tout cela en une boucle (code ci-dessus).

 int diag1=0; int diag2=0; for (i=0;i 

}

Pour mieux comprendre cet algorithme, vous devez peindre une masortingce sur votre cahier et numéroter ses éléments avec leur position dans la masortingce, puis appliquer l'algorithme étape par étape.Je suis sûr à 100% que vous comprendrez.

Et si j’essayais d’expliquer cette version? :RÉ

Il y a 3 parties importantes du code:

  • entrer la masortingce
  • calcul de la diagonale majeure (\ direction)
  • calcul de diagonale mineure (/ direction)

Et les voici, expliquèrent:

 // input elements for(i=1;i<=n;i++) // from left to right { for(j=1;j<=n;j++) // from up to down cin>>a[i][j]; // input element at (i,j) position } 

Ici, d et s contiennent les inter-valeurs des diagonales majeures et mineures respectivement. Au bout de 2 boucles, ils contiendront les résultats

 for (i=1;i<=n;i++) for (j=1;j<=n;j++) { if(i==j) // major diagonal - if coordinates are the same d=d+a[i][j]; // eg (1,1), (2,2) if(j==n-i+1 || i==n-j+1) // coordinates of the minor diagonal - check s=s+a[i][j]; // eg n=3 (3,1) (2,2) ... } 

J'espère que cela t'aides.

Notez que ce code commence les coordonnées de la masortingce à 1 au lieu de 0, vous aurez donc besoin d'allouer (n+1)x(n+1) espace pour la masortingce:

 double a[n+1][n+1]; 

avant de l'utiliser.

En outre, le code que vous avez donné n'est pas le plus efficace. Il a une complexité O(n^2) , alors que la tâche peut être effectuée dans O(n) comme ceci:

 // masortingx coordinates now start from 0 for (int i=0; i < n; ++i){ d += a[i][i]; // major s += a[i][n-1-i]; // minor } 
 int num[5][5]={0}; //decleration int i=0,j=0,sum=0; for (int i=0;i<5;i++) { for (int j=0;j<5;j++) { cin>>num[i][j]; } //Taking Masortingx input } cout< 

vous devez utiliser i + j == n + 1 au lieu de i + j == n - 1 pour la diagonale secondaire, c.-à-d.

 for(i = 1; i <= n; i++) { for(j = 1; j <= n; j++) { if(i == j) d += a[i][j]; //principal diagonal if(i + j == n+1) s += a[i][j];//secondary diagonal } }