Суммы по косой. Просуммировать элементы матрицы [latex]A(n,n)[/latex] по каждой из линий , параллельных главной диагонали. Напечатать полученные суммы.
Матрица | Суммы |
1 2 3 4 5 6 7 8 9 |
7 12 15 8 3 |
-1 2 -3 4 10 5 11 6 -7 8 -9 2 12 5 13 6 |
12 -2 31 1 15 3 4 |
0 0 0 0 |
0 0 0 |
Код программы:
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 |
#include <iostream> using namespace std; int main() { int t; cin>>t; const int n=t; int a[n][n]; int b[2*n-1]; for (int i=0;i<2*n-1;i++) b[i]=0; for (int i=0;i<n;i++) { for (int j=0;j<n;j++) { cin>>a[i][j]; cout<<a[i][j]<<" "; } cout<<"\n"; } for (int i=0;i<n;i++) for (int j=0;j<n;j++) { b[i-j+n-1]+=a[i][j]; } for (int i=2*n-2;i>=0;i--) cout<<b[i]<<" "; return 0; } |
Сначала вводим размер квадратной матрицы — [latex]n[/latex]. Создаем одномерный массив [latex]b[/latex] в который будет результат. В нем будет [latex]2n-1[/latex] элементов, которые мы заполняем нулями.После чего в цикле будем накапливать суммы [latex]b[i-j+n-1]+=a[i][j].[/latex].
При [latex]i=j[/latex], мы записываем сумму диагоналей в [latex]b[n-1][/latex], который находиться в середине нашего массива [latex]b[/latex], как нам и нужно.
Если [latex]i>j[/latex], мы записываем суммы в элементы после середины нашего массива [latex]b[/latex].
Если [latex]i<j[/latex], мы записываем суммы в элементы до середины нашего массива [latex]b[/latex].
Константу, которая нам нужна, будем искать по формуле [latex] max(j) — min(i)[/latex], которая равна [latex]n-1[/latex].
Код программы можно посмотреть тут
— Вычитайте текст. Уберите орфографические ошибки, пробел перед запятой.
— Что за странная метка «сумма диагоналей»?
— Ненужно использовать третий вложенный цикл и условный оператор. Вместо
должно быть
Вместо «…» должна быть какая-то формула. Догадываетесь какая?
Намёк: какие значения может принимать i — j?
1)Сделал два цикла.
2)Убрал «странную » метку.
3)Исправил(наверное) грамматические ошибки.
Похоже, что формула i-j+n-1 верна. Тем более, что Ваша программа работает. Но Вы не объяснили эту формулу в отчете. Т.е. вы использовали намек Игоря Евгеньевича «какие значения может принимать i – j?» для того чтобы вывести формулу, а теперь можете использовать те же соображения, чтобы пояснить как получается эта формула.
Поэтому я и написал сначала другой алгоритм.Он был понятный.А этот алгоритм получен путем перебора возможных вариантов.
Подсказываю: i-j равно нулю на главной диагонали, чем выше главной диагонали, тем i-j меньше, а чем ниже тем i-j больше. Ну Игорь Евгеньевич дал же ключевую подсказку “какие значения может принимать i – j?” Подставьте минимальное значение i и максимальное значение j, получите некоторое минимальное значение i-j, которое соответствует верхнему правому элементу. Теперь его нужно записать в первый (или последний, как хотите) элемент массива b. Вы записываете в первый элемент, т.е. в b[0]. Значит, т.к. i-j получилось отрицательным для этого углового элемента, к нему нужно прибавить некоторую константу, равную модулю этого отрицательного значения, чтобы получить в результате 0. В итоге формула для индекса будет выглядеть, как i-j+c, где c — эта константа (имеется в виду, что она не зависит от i и j). Забегая наперед, мы видим по итоговой формуле, что эта константа равна n-1.
Что ж, надеюсь теперь Вы поняли, как получается формула i-j+n-1 и сможете пояснить это в своем отчете.
Засчитано, 8 баллов (октябрьское задание в ноябре).
Но все же «Константу, которая нам нужна, будем искать по формуле max(j) — min(i), которая равна n-1.» — это предложение будет понятно или мне, или Вам, или тому кто прочтет все комментарии. Иначе, что за константа будет непонятно.