Было бы неплохо иметь комментарии на английском языке, но ваш код делает (второй цикл):
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
)).
Вы можете достичь всего этого за один цикл (код выше).