Как найти сумму диагоналей массива

0 / 0 / 0

Регистрация: 30.12.2019

Сообщений: 5

1

Найти сумму всех диагоналей и сравнить между с собой

22.01.2020, 23:48. Показов 4755. Ответов 4


Студворк — интернет-сервис помощи студентам

Вводится прямоугольный массив. Рассмотрим в нем линии, параллельные главной диагонали. На
каждой такой линии вычислим сумму элементов. Найти максимум среди данных сумм.
Например, в массиве
1 3 4 5
2 3 4 5
2 6 3 2
4 2 4 1
данные суммы равны 4, 4, 12, 8, 9, 9, 5, а максимум равен 12. Динамическими массивами не
пользоваться.



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

22.01.2020, 23:48

4

Модератор

2546 / 1643 / 895

Регистрация: 16.10.2013

Сообщений: 4,864

Записей в блоге: 13

23.01.2020, 09:35

2

Цитата
Сообщение от Kanatbekov_24
Посмотреть сообщение

Вводится прямоугольный массив. Рассмотрим в нем линии, параллельные главной диагонали.

раз есть главная диагональ, значит это квадратный массив, все же.



0



0 / 0 / 0

Регистрация: 30.12.2019

Сообщений: 5

23.01.2020, 10:38

 [ТС]

3

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



0



long399

Модератор

2546 / 1643 / 895

Регистрация: 16.10.2013

Сообщений: 4,864

Записей в блоге: 13

23.01.2020, 11:14

4

Kanatbekov_24, это вы должны думать, а не я

Добавлено через 31 минуту

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <ctime>
#include <limits>
using namespace std;
#define SIZE 4
int main(){
    srand(time(NULL));
    int a[SIZE][SIZE];
    
    for(int i = 0; i < SIZE; i++) {
        for(int j = 0; j < SIZE; j++) {
            a[i][j] = rand() % 100;
            cout << a[i][j] << "t";
        }
        cout << endl;
    }
    
    int sumDiags[2 * SIZE - 1] = {};
    int k = 0;
    
    // с левого нижнего края до главной диагонали
    for(int i = 0; i < SIZE; i++) {
        for(int j = i; j >= 0; j--) {
            sumDiags[k] += a[SIZE - i - 1 + j][j];
        }
        ++k;
    }
    
    // после главной диагонали
    for(int i = 0; i < SIZE - 1; i++) {
        for(int j = SIZE - 1; j >= i + 1; j--) {
            sumDiags[k] += a[j - i - 1][j];
        }
        ++k;
    }
    
    int max = std::numeric_limits<int>::min();
    cout << endl << "суммы диагоналей : ";
    for(int i = 0; i < k; i++) {
        if(max < sumDiags[i]) max = sumDiags[i];
        cout << sumDiags[i] << " ";
    }
    cout << endl << "максимум: " << max;
    
    return 0;
}



0



analogov net

2120 / 948 / 439

Регистрация: 17.11.2018

Сообщений: 2,494

23.01.2020, 22:51

5

Цитата
Сообщение от long399
Посмотреть сообщение

раз есть главная диагональ, значит это квадратный массив

Это не обязательно. Главная диагональ не потому главная, что массив квадратный, а потому, что начинается в левом верхнем углу и продолжается вправо-вниз до “пересечения” либо с последней строкой, либо с последним столбцом, либо с обоими сразу. Индексы элементов, которые находятся на ней равны ( i == j ).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#define N 4
#define M 4
 
int main()
{
    int matr[N][M] = {
       {1, 3, 4, 5},
       {2, 3, 4, 5},
       {2, 6, 3, 2},
       {4, 2, 4, 1}
    };
    int diagonals[N + M - 1] = {0}, maxDiag = 0;
 
    for( int i = N - 1; i > -1; i-- )
        for( int j = 0; j < M; j++)
            diagonals[N - 1 - i + j] += matr[i][j];
 
    for( int i = 0; i < N + M - 1; i++ )
        if( diagonals[i] > diagonals[maxDiag] )
            maxDiag = i;
 
    cout << "max diag: " << maxDiag + 1 << "nmax sum : " << diagonals[maxDiag] << endl;
 
    return 0;
}



1



for (row=0; row<SIZE; row++)
    {
        for (col=0; col<SIZE; col++)
        {
            if (row == 0 && col == 0) {
                answer+=my_data[row][col];
            }
            else if ((row)/(col) == 1) //1 is slope of array
            {
                answer+=my_data[row][col];
            }
        }
    }
    printf("The diagonal sum of the 8x8 array is: %in",answer);

starting from [0,0] and ending at [8,8]

“Sum the diagonal values inside the
8×8 array starting at [0,0]”

I realize I can do a single for loop since the shape is just 1:1 but how would I do it just in case I need to sum a diagonal 8×10 array?

codaddict's user avatar

codaddict

443k81 gold badges492 silver badges528 bronze badges

asked Mar 2, 2011 at 8:09

Kyle's user avatar

2

Diagonal element(s) and main diagonal are defined only for a square matrix.

if rowcount == colcount
  sum = 0
  for i = 0 to rowcount
    sum += matrix[i][i]
  end-for
else
  print Diagonal sum not defined
end-if

For a non-square matrix if you want to sum the elements at position with equal row and column number you can do:

sum = 0
for i = 0 to min(rowcount,colcount)
  sum += matrix[i][i]
end-for
print sum

answered Mar 2, 2011 at 8:13

codaddict's user avatar

codaddictcodaddict

443k81 gold badges492 silver badges528 bronze badges

1

Depends how you will define diagonal elements. If we define diagonal elements as – cells through which diagonal line passes somewhere NEAR the center of cell, then diagonal elements of matrix:

enter image description here

(0,0);(1,0);(2,1);(3,1);(4,2);(5,2) will be perfectly valid.

answered Mar 2, 2011 at 10:12

Agnius Vasiliauskas's user avatar

Well the primary concern over here is, what’s the definition of diagonal elements if it’s not a square matrix. If it’s a square matrix then it should be RowCount==ColCount. But what if it’s not a square matrix??

answered Mar 2, 2011 at 8:14

NirmalGeo's user avatar

NirmalGeoNirmalGeo

7734 silver badges12 bronze badges

3

codaddict is right; only square matrixes have diagonal elements.
I suppose you want addition of elements where rownum==colnum?

answered Mar 2, 2011 at 8:16

CyprUS's user avatar

CyprUSCyprUS

4,1299 gold badges48 silver badges93 bronze badges

My guess would be to ignore the excess rows or columns if it’s non-square; that seems like the most reasonable approach, although that is just a guess since the diagonal of a non-square matrix isn’t defined, but since you’re asking about 2-dim array instead of a matrix, I presume the context of the question is a programming assignment, rather than linear algebra.

To do this, you can get the min length of row & column and then iterate from 0 to that min length:

diag_len = min (row_size, col_size);

for (int i = 0; i < /* or <= */ diag_len; i++) {
  answer += my_data[i][i];
}

This works in both the square and lossy non-square cases. Your example code ends up considering the coordinates of every cell which is wasteful when you know you only care about the cases where row == col. (It also obviates the need for a special case when row & col are both 0 and avoids division, which is a slower CPU operation than addition.)

answered Mar 2, 2011 at 8:29

Wil Cooley's user avatar

Wil CooleyWil Cooley

9006 silver badges18 bronze badges

1

include

int main(){

int a[10][10],i,j,sum=0,m,n;

printf(“nEnter the row and column of matrix: “);
scanf(“%d %d”,&m,&n);

printf(“nEnter the elements of matrix: “);

answered Mar 29, 2014 at 17:13

rumi zaman's user avatar

1

int s = 0;
for (int i = 0; i < n; ++i) {
    for (int j = 0; j< n; ++j) {
        s += A[i][j][i];
    }
}

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

Harry's user avatar

Harry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

задан 25 окт 2021 в 17:47

vover's user avatar

2

для трехмерной матрицы это будет выглядеть как

int sum = 0
for (int i = 0; i < n; i ++) {
    sum += matrix[i][i][i];
}

а вот побочных диагоналей, как я понимаю должно быть много?

sum1 += matrix[n-1-i][i][i];
sum2 += matrix[i][n-1-i][i];
sum3 += matrix[i][i][n-1-i];

ну и если массив одномерный (как обычно и делается), то тогда надо вычислять индекс по типу

const int index = i*n*n + i*n + i;
sum += matrix[index];

ответ дан 25 окт 2021 в 18:28

Zhihar's user avatar

ZhiharZhihar

36.9k4 золотых знака25 серебряных знаков67 бронзовых знаков

ну для начала нужно, чтобы в массиве реально существовали эти диагонали, попадающие на конкретные числа. Ещё возможно в перекрестии ты дважды учитываешь одно число – стандартная ошибка при программировании.

п. с. упрощай до минимума для анализа – 3х3. И заполняешь к примеру нулями, а в центре 1 и посмотри что получится. Проверяй. Должно быть кконечно 1, А вот если 2, то как раз тот самый косяк и есть. Эксперементируй в общем.

п. п. с. алгоритм определения диагоналей какой ?!

1. Ну ты парень прост как валенок! Ныне уже надо “защиту от дураков” ставить – делать вначале проверку, что диагонали корректные существуют !

2. Язык программирования твой не изучал ни разу. Не вижу ввода изнального всех значений массива. Ты совем новичОк? Хорошо допустим он как-то уже был задан !

3. if i==j: – это что такое? Проверка на равенство элементов или что? Зачем? после этого суммирование? таковых ?

Если проверка на равенство нумерации, то в любом случае ты забываешь вторую диагональ! Ведь вторая диагональ пойдёт справа-налево и сверху вниз. (снизу врятли кто её вверх “потянет”:))) Опять же центральный элемент будет посчитан дважды, возможно проще всего попросту его будет вычесть один раз.

4. такое чувство что в начале ты таким образом не можешь ввести двумерный массив никак! Там ж чисел будет n*n, а у тебя “строка” вроде как получается.

п. с. лет 20 назад изучал разные языки програмирования. По моему тут делаешь чего попало (честно говоря). Тебе надо брать поэлементно каждую диагональ и вот как ты складываешь в конце! s. Ты чего-то ненужное складываешь с этой проверкой – личное мнение.

Источник: подкорректировал ответ.

Тем, кто знакомым с математическими матрицами, будет не трудно освоить и двумерные массивы в Pascal. Матрица – это математический объект, представляющий собой прямоугольную таблицу. Таблица состоит из элементов, которые находятся на пересечении строк и столбцов, определяющих их, то есть i-ая строка и j-ый столбец задают адрес k-ому элементу матрицы (kij). Двумерные массивы абсолютно аналогичны математическим матрицам.

В отличие от одномерных массивов, двумерные характеризуются в программе парой индексов, один из которых соответствует номеру строки, другой – столбца:

Mas[m, n], где Mas – имя массива, n – номер строки, а m – номер столбца.

Описать матрицу в программе можно несколькими способами:

1) В разделе описания переменных:

Var Mas: Array[1..n, 1..m] of <тип элементов>;

2) При помощи одномерного массива, элементами которого являются одномерные массивы.
Пример:

Const
n = 5; m = 10;
Type
Arr1 = Array[1..m] of <тип элементов >;
Arr2 = Array[1..n] of arr1;
Var Mas: arr2;

Переменная Mas – матрица, состоящая из пяти строк, в каждую из которых включено по десять элементов.

3) Предыдущий способ можно упростить так:

Const n = 5; m = 10;
Турe arr=Array[1..n] Of Аrrау[1..m] of <тип элементов>;
Var Mas: arr;

4) И снова сократив запись, получим:

Const n = 5; m = 10;
Type arr = Array[1..n,1..m] of <тип элементов>;
Var Mas: arr;

Для обработки содержимого матрицы, удобно пользоваться вложенными циклами:

For i:= 1 To n Do
  For j:= 1 To m Do

Например, для заполнения массива случайнми числами:

for i:=1 to n do
  for j:=1 to n do 
    x[i,j]:=random(100); 

Для вывода двумерного массива вещественных чисел размером n строк, m столбцов:

for i:=1 to n do begin
  for j:=1 to m do 
    write(x[i,j]:5:2);
  writeln;
end;

В следующей программе массив сначала заполняется числами с клавиатуры, а затем выводиться на экран.

program input_and_output_array;
uses crt;
const n=3; m=3;
var i, j: integer;
mas: array[1..n, 1..m] of integer;
begin
  {ввод массива}
  for i:=1 to n do
    for j:=1 to m do
    begin
      write(' Элемент ', i,' строки, ',j,' столбца = ');
      readln(mas[i, j]);
    end;
  writeln(' Получившаяся матрица: ');
  {вывод массива}
  for i:=1 to n do
  begin
    for j:=1 to m do
    begin
      write(mas[i, j]:5);
    end;
  writeln
  end;
end.

Количество элементов в массиве (его размерность) можно узнать, умножив количество строк на количество столбцов.

Сумма всех элементов квадратной матрицы:

sum:=0;

for i:=1 to n do
  for j:=1 to n do 
    sum:=sum+x[i,j];

writeln('Сумма=',sum); 

Сумма элементов главной диагонали квадратной матрицы (элементы главной диагонали имеют одинаковые индексы -x[1,1], x[2,2] и т.д.):

sum:=0;

for i:=1 to n do 
  sum:=sum+x[i,i];

writeln('Сумма=',sum);

Сумма элементов побочной диагонали (диагонали противоположной главной). Индексы элементов побочной диагонали в сумме равны n+1, т.е. i+j=n+1 или j=n+1-i:

sum:=0;

for i:=1 to n do 
  sum:=sum+x[i,n+1-i];

writeln('Сумма=',sum);

Сумма элементов ниже главной диагонали квадратной матрицы (строго ниже):

sum:=0;

for i:=1 to n do
  for j:=1 to n do 
    if i>j then 
      sum:=sum+x[i,j];

writeln('Сумма=',sum);

Можно не просматривать весь массив, а брать только нужные элементы:

sum:=0;

for i:=2 to n do
  for j:=1 to i-1 do 
    sum:=sum+x[i,j];

writeln('Сумма=',sum);

Сумма элементов выше и на главной диагонали квадратной матрицы:

sum:=0;

for i:=1 to n do
  for j:=1 to n do
    if i<=j then 
      sum:=sum+x[i,j];

writeln('Сумма=',sum);

Здесь также можно не просматривать весь массив, а брать только нужные элементы:

sum:=0;

for i:=1 to n do
  for j:=i to n do 
    sum:=sum+x[i,j];

writeln('Сумма=',sum);

Сумма элементов ниже побочной диагонали квадратной матрицы (строго ниже) :

sum:=0;

for i:=1 to n do
  for j:=1 to n do
    if i+j>n+1 then 
      sum:=sum+x[i,j];

writeln('Сумма=',sum);

Можно не просматривать весь массив, а брать только нужные элементы:

sum:=0;

for i:=2 to n do
  for j:=n+2-i to n do 
    sum:=sum+x[i,j];

writeln('Сумма=',sum);

Если надо посчитать сумму элемсентов ниже побочной диагонали и на ней, то в предыдущем примере, при просмотре всего массива в предыдущем примере надо заменить знак отношения > на >=, а при просмотре толко нужных элементов применить такой код:

sum:=0;

for i:=1 to n do
  for j:=n+1-i to n do 
    sum:=sum+x[i,j];

writeln('Сумма=',sum);

При подсчете суммы элементов выше и на главной диагонали, выше и на побочной диагонали возможно применине такого кода:

sum:=0;

for i:=1 to n do
  for j:=1 to n do
    if (i<=j) and (i+j<=n+1) then
      sum:=sum+x[i,j];

writeln('Сумма=',sum);

Подсчет сумм элементов по строкам:

for i:=1 to n do begin
  sum:=0;

  for j:=1 to n do 
    sum:=sum+x[i,j];

  writeln('Сумма ',i,'-й строки',sum);
end;

Подсчет сумм элементов по столбцам:

for j:=1 to n do begin
  sum:=0;

  for i:=1 to n do 
    sum:=sum+x[i,j];

  writeln('Сумма ',j,'-го столбца ',sum);
end;

Безусловно суммы по строкам и столбцам можно записывать в одномерный массив. Например, для сумм по столбцам:

for i:=1 to n do 
  sum[j]:=0;

for i:=1 to n do
  for j:=1 to n do 
    zum[j]:=sum[j]+x[i,j];

{вывод сумм по столбцам}
for i:=1 to n do 
  write(sum[i]:4);
writeln; 

Суммы элементов по диагоналям, параллельным главной диагонали.

Очевидно, что таких сумм будет 2n-1. Кроме того, разности индексов эдементов, стоящих на одной диагонали будут равны друг другу. Имеется в виду разность «номер строки минус номер столбца». Эти разности будут меняться от -n+1 для самой верхней диагонали s1, содержащей всего лишь один элемент, до n-1 для диагонали s2N-1, расположенной в самом низу матрицы и содержащей также всего один элемент. Таким образом, для подсчета сумм мы должны объявить массив:

Var sum:array[-n+1..n-1] of integer;

Число элементов в этом массиве будет 2n-1. Код для подсчета этих сумм:

for i:=-n+1 to n-1 do 
  sum[i]:=0;

for i:=1 to n do
  for j:=1 to n do 
    sum[i-j]:=sum[i-j]+x[i,j];

for i:=-n+1 to n-1 do 
  write(sum[i]); 

Суммы элементов по диагоналям, параллельным побочной диагонали.

for i:=2 to 2*n do 
  sum[i]:=0;

for i:=1 to n do
  for j:=1 to n do 
    sum[i+j]:=sum[i+j]+x[i,j];

for i:=2 to 2*n do 
  write(sum[i]);

Суммы элементов по периметрам двумерного массива.

Cледует различать четный или нечетный порядок матрицы n. Число сумм будет равно k=n div 2 при четном n и k=n div 2 +1 при нечетном значении n.

Счет суммы начинается по строке i от столбца j равного i и заканчивается столбцом n-i+1, т.е. начинается с элемена находящегося на главной диагонали и заканчивается элементом на побочной диагонали.

Одновременно учитываются элементы из параллельной строки, индекс которой равен n-i+1.

Затем считаем элементы по двум паралельным столбцам i и n-i+1 (не учитывая элементы, стоящие в строках). Если n -нечетное число, то выводим значение центрального элемента массива x[k+1,k+1].

k:=n div 2;

for i:=1 to k do begin
  sum:=0;

  {строки}
  for j:=i to n-i+1 do
    sum:=sum+x[i,j]+x[n-i+1,j];

  {столбцы}
  for j:=i+1 to n-i do
    sum:=sum+x[j,i]+x[j,n-i+1];

  writeln(sum); {вывод суммы}
end;

if n mod 2=1 then
  writeln(x[k+1,k+1]); 

Добавить комментарий