Вывести столбец матрицы, в котором больше отрицательных элементов - C (СИ)
Формулировка задачи:
Задача: Дана целочисленная квадратная матрица размерности m*n.Найти наименьшее из значений элементов столбца, который обладет наибольшей суммой модулей элементов. Если таких столцов несколько, взять тот из них, в котором больше отрицательных элементов.
Здраствуйте! Я написал код, который находит наименьшее значение в столбце, который имеет макс сумму, но я не знаю как написать, чтобы при совпадении макс суммы выводило тот, где больше отрицательных. Помогите пожалуйста доделать программу.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(NULL));
int N = rand()%9+1, M=N;
int i, j, a[M][N];
for (i = 0; i < M; i++)
{
for (j = 0; j < N; j++)
{
a[i][j] = rand() % 10-5;
printf("%5d", a[i][j]);
}
printf("\n");
}
int max_s=0, max_j = max_s;
for(j=0;j<N;j++)
{
int i=0, sum=0;
while(i<N)
{
sum+=abs(a[i++][j]);
}
if (sum > max_s)
{
max_s = sum; max_j = j;
}
}
int min = 0;
for (int t = 0; t<M; t++)
min=(a[t][max_j] < a[min][max_j]) ? t : min;
printf("Наибольшая сумма модулей элементов в столбце %d и равна %d\n", 1+max_j, max_s);
printf("Наименьшее из значений: a[%d][%d] = %d\n", min+1,max_j+1,a[min][max_j]);
}Решение задачи: «Вывести столбец матрицы, в котором больше отрицательных элементов»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define M 7
#define N 9
int main()
{
system("chcp 1251 > nul");
srand(time(NULL));
int i, j, a[M][N], max_s = 0, max_j, sum, max_neg = 0, count_neg, min;
for (i = 0; i < M; i++, putchar('\n'))
for (j = 0; j < N; j++)
printf("%3d", a[i][j] = rand() % 10-5);
for(j = 0; j < N; j++){
for(i = 0, sum = 0, count_neg = 0; i < M; i++){
sum += abs(a[i][j]);
if(a[i][j] < 0)
count_neg++;
}
if (sum > max_s){
max_s = sum;
max_j = j;
if(count_neg > max_neg)
max_neg = count_neg;
}
if(sum == max_s && count_neg > max_neg){
max_j = j;
max_neg = count_neg;
}
}
min = a[0][max_j];
for (i = 1; i < M; i++)
if(a[i][max_j] < min){
min = a[i][max_j];
j = i;
}
printf("Наибольшая сумма модулей элементов в столбце %d и равна %d\n", max_j, max_s);
printf("Наименьшее из значений: a[%d][%d] = %d\n", j, max_j, min);
}
Объяснение кода листинга программы
В этом коде создается матрица случайных чисел, затем находится столбец с наибольшим количеством отрицательных чисел, и выводится наибольшая сумма модулей элементов в этом столбце и наименьшее из значений в этом столбце.
- Объявлены переменные:
MиN- размеры матрицы;a- матрица;max_s- максимальная сумма модулей элементов в столбце;max_j- номер столбца с максимальной суммой модулей элементов;sum- сумма элементов в текущем столбце;count_neg- количество отрицательных элементов в текущем столбце;max_neg- максимальное количество отрицательных элементов в столбце;min- наименьшее значение в текущем столбце;iиj- индексы для обхода матрицы.
- Заполнение матрицы случайными числами от -5 до 5.
- Обход матрицы для определения столбца с наибольшим количеством отрицательных чисел:
- Внешний цикл
forдля обхода столбцов; - Внутренний цикл
forдля обхода строк в текущем столбце; - Суммирование модулей элементов в текущем столбце;
- Подсчет количества отрицательных элементов в текущем столбце;
- Если текущий столбец имеет максимальную сумму модулей элементов, то обновление значений
max_s,max_j,max_neg; - Если текущий столбец имеет ту же сумму модулей элементов, что и предыдущий, но имеет большее количество отрицательных элементов, то обновление значений
max_s,max_j,max_neg.
- Внешний цикл
- Обход строк в найденном столбце для определения наименьшего значения.
- Вывод результатов.