Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 31
1

Вывести матрицу, которая имеет максимальный след

15.11.2010, 23:10. Показов 1229. Ответов 8
Метки нет (Все метки)

Даны N квадратных матриц различной размерности. Требуется вывести матрицу, которая имеет максимальный след.

На стандартном потоке ввода задано натуральное число N и далее N квадратных матриц Mi, каждая размерности Ni. Матрицы заданы следующим образом. Сначала идет размерность, далее идут элементы матрицы по строкам - то есть, в первой строке задана первая строка матрицы, во второй - вторая и так далее. Элементы матриц - целые 32-битные числа.

На стандартный поток вывода напечатайте матрицу, которая имеет наибольший след среди введенных матриц. Если несколько введенных матриц имеют одинаковый максимальный след, выведите ту, которая была введена первой.

Указание: для хранения матриц используйте динамическую память. Считайте, что след любой входной матрицы помещается в 64-битное целое число.
Не получается решить эту задачу. Прошу помочь. Решение нужно на языке Си! Не С++, не C#, не С--, не С+-, не Сw, а именно Си!

Добавлено через 58 секунд
Вот мое решение но оно вообще не работает=(

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
47
48
49
50
51
52
#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");
    }
}
Добавлено через 1 час 20 минут
Помогите!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.11.2010, 23:10
Ответы с готовыми решениями:

Напечатать ту матрицу из двух, которая имеет минимальный след
Даны две квадратные матрицы. Напечатать ту из них, ко¬торая имеет минимальный &quot;след&quot; (т.е. сумму...

Напечатать матрицу которая имеет минимальный "след”
Добрый день: Есть задача: Даны две квадратные матрицы nxn. Напечатать ту из них, которая имеет...

Поменять местами строчку которая имеет максимальный елемент со строкой которая имеет минимальный елемент.Вывести обе матрицы на екран!!
Данно квадратную матрицу А розмера NxN (N&lt;=10), которая состоить с действительных...

Даны две квадратные матрицы. Напечатать ту из них, которая имеет минимальный след
Даны две квадратные матрицы. Напечатать ту из них, которая имеет минимальный &quot;след' (т.е. сумму...

8
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
15.11.2010, 23:15 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вот Вам переделанный Ваш код (но теперь рабочий):
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
47
#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=(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;
            tmp_matrix=matrix;
            lab1=m;
            //lab2=b;
        }
 
 
        }
    for (q=0; q<=lab1-1; q++) {
        for(w=0; w<=lab1-1; w++) {
            printf("%d ", tmp_matrix[q+w*lab1]);
        }
        printf("\n");
    }
}
Но над ним еще можно сильно поработать. Очень много лишнего и не совершенного.
1
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 31
15.11.2010, 23:58  [ТС] 3
Большое спасибо, но программа проходит лишь 12 тестов.)
Система проверки говорит "неполное решение" =(
0
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
16.11.2010, 07:57 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

xxxfelxxx,
Предлагаю все-таки исправить некоторые моменты (может как раз в них и дело):
1. У Вас в задании даже написано:
след любой входной матрицы помещается в 64-битное целое число
, а Вы используете простой int. - я думаю, что это самая главная ошибка (вполне возможно исправив ее все тесты пройдут).
2. В последнем рабочем коде все выглядит так: выделили память под очередной массив, если не подошел - мы не освобождая память выделяем память под следующий массив. (Если массив подходит нам, то указателю на последнюю матрицу с максимальным следом присваиваем адрес на новую память, а предыдущую память тоже не освобождаем).
Смотрите коментарии как это исправить:
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
47
48
49
50
51
52
53
54
55
#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");
    }
}
3. Теперь рассмотрим функцию trac()
Я бы вместо этого:
C
1
2
3
4
5
   for (j=0; j<=m-1; j++){
            for (k=0; k<=m-1; k++) {
                if (k==j) tr=tr+matrix[j+k*m];
            }
        }
написал бы:
C
1
2
   for (j=0; j<=m-1; j++)
 tr=tr+matrix[j+j*m];
Но Ваш вариант тоже правильный, просто мой быстрее.
4. Хоть это и не влияет на результат - уберите лишние неиспользуемые переменные.
1
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 31
16.11.2010, 15:07  [ТС] 5
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
47
#include <stdio.h>
#include <stdlib.h>
 
int
main(void)
{
    long int *matrix;
    long int tr_old=0,tr_new;
    long int *tmp_matrix=NULL;
    long int fl=0,m,n,j,i,k,lab1=0,q, w;
    scanf("%ld", &n); // кол-во матриц
    for (i=0; i<=n-1; i++) {
        tr_new=0;
        scanf("%ld", &m); // размерность i-й матрицы
        fl+=m;
        matrix=(long int*)malloc(m*m*sizeof(long int));
        for (j=0; j<=m-1; j++){
            for (k=0; k<=m-1; k++) {
                scanf("%ld", &matrix[j+k*m]);
                if (j==k) {
                    tr_new=tr_new+matrix[j+k*m];
                }
            }
        }
        if (tr_old<tr_new) {
            tr_old=tr_new;
            if(tmp_matrix!=NULL) {
                free (tmp_matrix);
            }
            tmp_matrix=matrix;
            lab1=m;
        } else {
            free(matrix);
        }
    }
    if (fl==0) {
        printf("0");
    } else {
        for (q=0; q<=lab1-1; q++) {
            for(w=0; w<=lab1-1; w++) {
                printf("%ld ", tmp_matrix[q+w*lab1]);
            }
        printf("\n");
        }
    }
    return 0;
}
Вот итоговая версия. Но результат тот же - 12 тестов. =(
0
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
16.11.2010, 15:17 6
Вы сразу у всех переменных тип поменяли. Можно было только tr_old и tr_new. Дайте ссылку на проверочную систему.
0
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 31
16.11.2010, 15:19  [ТС] 7
Cистема Ejudje.
Закрытая к сожалению, МГУшная
0
Эксперт С++
4719 / 2540 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
16.11.2010, 15:26 8
Тогда давай так, объявите эти две переменные:
C
1
long long tr_old=0, tr_new;
1
0 / 0 / 0
Регистрация: 24.10.2010
Сообщений: 31
16.11.2010, 15:39  [ТС] 9
Я тебя обожаю!))
Ты мой спаситель >
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.11.2010, 15:39

Даны две квадратные матрицы. Напечатать ту из них, которая имеет минимальный след
Даны две квадратные матрицы. Напечатать ту из них, которая имеет минимальный &quot;след' (т.е. сумму...

Напечатать ту из заданных матриц, которая имеет минимальный "след"
Даны две квадратные матрицы. Напечатать ту из них, которая имеет минимальный &quot;след&quot; (т.е. сумму...

Напечатать ту из матриц, которая имеет минимальный "след"
Прошу оказать содействие: Задача: Даны две квадратные матрицы nxn. Напечатать ту из них, которая...

Напечатать ту из матриц, которая имеет минимальный "след"
1)Даны две квадратные матрицы. Напечатать ту из них, ко¬торая имеет минимальный &quot;след&quot; (т.е. сумму...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.