Вывести матрицу, которая имеет максимальный след - C (СИ)
Формулировка задачи:
Даны N квадратных матриц различной размерности. Требуется вывести матрицу, которая имеет максимальный след.
На стандартном потоке ввода задано натуральное число N и далее N квадратных матриц Mi, каждая размерности Ni. Матрицы заданы следующим образом. Сначала идет размерность, далее идут элементы матрицы по строкам - то есть, в первой строке задана первая строка матрицы, во второй - вторая и так далее. Элементы матриц - целые 32-битные числа.
На стандартный поток вывода напечатайте матрицу, которая имеет наибольший след среди введенных матриц. Если несколько введенных матриц имеют одинаковый максимальный след, выведите ту, которая была введена первой.
Указание: для хранения матриц используйте динамическую память. Считайте, что след любой входной матрицы помещается в 64-битное целое число.
Вот мое решение но оно вообще не работает=(
#include <stdio.h>
#include <stdlib.h>
int
trac (int *matrix, int m)
{
int tr=0,j,k;
for (j=0; j<=m-1; j++){
for (k=0; k<=m-1; k++) {
if (k==j) tr=tr+matrix[j+k*m];
}
}
return tr;
}
int
main(void)
{
int **matrix;
int *tmp_matrix;
int m,n,j,i,k,a,b,tr_old=0,tr_new,lab1,lab2,q,w;
scanf("%d", &n); // кол-во матриц
for (i=0; i<=n-1; i++) {
scanf("%d", &m); // размерность i-й матрицы
matrix=malloc(m*m*sizeof(int));
for (j=0; j<=m-1; j++){
for (k=0; k<=m-1; k++) {
scanf("%d", *matrix[j+k*m]);
}
}
tr_new=trac(*matrix, m);
if (tr_old<tr_new) {
tr_old=tr_new;
tmp_matrix=malloc(m*m*sizeof(int));
for (a=0; a<=m-1; a++){
for (b=0; b<=m-1; b++) {
tmp_matrix[a+b*m]=matrix[a+b*m];
}
}
lab1=a;
lab2=b;
}
}
for (q=0; q<=lab1-1; q++) {
for(w=0; w<=lab2; w++) {
printf("%d ", tmp_matrix[q+w*lab2]);
}
printf("\n");
}
}
Помогите!
Решение задачи: «Вывести матрицу, которая имеет максимальный след»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
int
trac (int *matrix, int m)
{
int tr=0,j,k;
for (j=0; j<=m-1; j++){
for (k=0; k<=m-1; k++) {
if (k==j) tr=tr+matrix[j+k*m];
}
}
return tr;
}
int
main(void)
{
int *matrix;
int *tmp_matrix=NULL;
int m,n,j,i,k,a,b,tr_old=0,tr_new,lab1,lab2,q, w;
scanf("%d", &n); // кол-во матриц
for (i=0; i<=n-1; i++) {
scanf("%d", &m); // размерность i-й матрицы
matrix=(int*)malloc(m*m*sizeof(int));
for (j=0; j<=m-1; j++){
for (k=0; k<=m-1; k++) {
scanf("%d", &matrix[j+k*m]);
}
}
tr_new=trac(matrix, m);
if (tr_old<tr_new) {
tr_old=tr_new;
if(tmp_matrix!=NULL)
{
// удаляем память на которую указывает tmp_matrix
}
tmp_matrix=matrix;
lab1=m;
//lab2=b;
}
else
{
//удаляем память на которую указывает matrix
}
}
for (q=0; q<=lab1-1; q++) {
for(w=0; w<=lab1-1; w++) {
printf("%d ", tmp_matrix[q+w*lab1]);
}
printf("\n");
}
}
Объяснение кода листинга программы
Код представлен на языке C и выполняет следующие действия:
- Ввод данных:
- Запрашивает у пользователя количество входных матриц (переменная
n). - Для каждой матрицы запрашивает ее размерность (переменная
m). - Считывает элементы матрицы с помощью функции
scanf(). Элементы сохраняются в динамически выделяемой памяти, управление которой осуществляется с помощью указателяmatrix.
- Запрашивает у пользователя количество входных матриц (переменная
- Вычисление следа:
- Для каждой матрицы вычисляет след с помощью функции
trac(). Эта функция проходит по всем элементам матрицы и суммирует их значения, если элемент является элементом главной диагонали (т.е. индексы элемента равны индексам матрицы). - Если след текущей матрицы больше, чем след предыдущей матрицы, обновляет значение следа и сохраняет ссылку на текущую матрицу в переменной
tmp_matrix.
- Для каждой матрицы вычисляет след с помощью функции
- Вывод результата:
- После обработки всех входных матриц, выводит на экран матрицу с максимальным следом.
- Для этого перебирает все элементы матрицы и выводит их значения с помощью функции
printf(). Важно отметить, что код не содержит ошибок обработки исключений и не освобождает память, выделенную под временные матрицы, которые уже не нужны. Это может привести к утечкам памяти.