вычислить сумму диагоналей в матрице - PullRequest
10 голосов
/ 25 января 2012

Мне нужно вычислить сумму двух диагоналей в матрице в C ++, у меня уже есть решение для этого, но я должен быть тупым, потому что я не могу понять, что он делает, поэтому я хотел бы знать, есть ли другая версия что я могу понять. вот код, который делает работу:

cout<<"Jepi rangun e  matrices"<<endl;  // pra bejme manipulim me matrice katrore ku rreshtat=kolonat
cin>>n;
cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica

for(i=1;i<=n;i++)
{
     for(j=1;j<=n;j++)
        cin>>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];
    }

Часть, которую трудно понять, это

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

Вот весь код, который я изменил, но он не работает для дополнительной диагонали:

#include <iostream>
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"<<endl;  // pra bejme manipulim me matrice katrore ku rreshtat=kolonat
    cin>>n;
    cout<<"Tani jepi elementet e matrices"<<endl; // lexohet matrica

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            cin>>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;
}

Ответы [ 5 ]

22 голосов
/ 25 января 2012

Было бы неплохо иметь комментарии на английском языке, но ваш код делает (второй цикл):

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

Гораздо более приятный и эффективный код (с использованием n вместо n^2) будет:

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

Это проходит через диагонали (оба в одной петле!) И не проходит через другие элементы.

EDIT:

Главная диагональ имеет координаты {(1,1), (2,2), ..., (i,i)} (для этого i == j).

Вторичная диагональ имеет координаты (в матрице 3x3): {(1,3), (2,2),(3,1)}, что в общем случае: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}. Но в C массивы индексируются от 0, а не от 1, поэтому вам не понадобится +1 (вероятно).

Все эти элементы во вторичной диагонали, которые должны соответствовать условию: i == n - j + 1 (снова из-за индексации C с 0 +1 изменяется на -1 (i=0,, n=3, j=2, j = n - i - 1 )).

Вы можете достичь всего этого за один цикл (код выше).

6 голосов
/ 25 января 2012
int diag1=0;
int diag2=0;

for (i=0;i<n;i++)
 for (j=0;j<n;j++){

  if(i==j)  diag1+=a[i][j]; //principal diagonal 
  if(i+j==n-1) diag2+=a[i][j];//secondary diagonal

}

Чтобы лучше понять этот алгоритм, вы должны нарисовать матрицу на своем ноутбуке и нумеровать ее элементы с их положением в матрице, а затем применять алгоритм шаг за шагом.что вы поймете

3 голосов
/ 25 января 2012

Как насчет того, чтобы попытаться объяснить эту версию?: D

Существует 3 важных части кода:

  • ввод матрицы
  • вычисление большой диагонали (\ направление)
  • вычисление вспомогательнойдиагональ (/ направление)

И вот они, объяснено:

// 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
}

Здесь d и s содержат взаимные значения большой и меньшей диагоналей соответственно.В конце двух циклов они будут содержать результаты

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];   // e.g. (1,1), (2,2)
        if(j==n-i+1 || i==n-j+1)  // coordinates of the minor diagonal - check
           s=s+a[i][j];           // e.g. n=3 (3,1) (2,2) ...
      }

Надеюсь, это поможет.

Обратите внимание, что этот код начинает матричные координаты с 1 вместо 0, поэтому вам действительно нужновыделите (n+1)x(n+1) место для матрицы:

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

перед ее использованием.

Кроме того, код, который вы дали, не самый эффективный.Он имеет O(n^2) сложность, в то время как задача может быть выполнена в O(n) следующим образом:

// matrix coordinates now start from 0
for (int i=0; i < n; ++i){
    d += a[i][i]; // major
    s += a[i][n-1-i]; // minor
}
0 голосов
/ 04 марта 2018

вы должны использовать i + j == n + 1 вместо i + j == n - 1 для дополнительной диагонали, т.е.

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

    }
}
0 голосов
/ 24 мая 2016
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 Matrix input
}
        cout<<endl<<"The Matrix is "<<endl;
    for (int i=0;i<5;i++)
    {
        for (int j=0;j<5;j++)
        {
            cout<<num[i][j]<<" ";
        }
            cout<<endl;               //Displaying the Matrix
    }                               
cout<<endl<<"The sum of diagonals of the matrix is "<<endl;
if(i==j) 
{
    for (i=0;i<5;i++)
    {
        for (j=0;j<5;j++)
        {
            if (i==j)       //This loop works where i and j will be equal
            {
            sum=sum+num[i][j];
            }
        }
    }
    cout<<sum;
}
else   //Some times the user creates 4 x 3 matrix or so than diagonals not match so. . . 
{
    cout<<"The sum is not Possible";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...