Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.02.2015
Сообщений: 69
1

Найти столбец в матрице с минимальным произведением элементов

16.12.2016, 23:21. Показов 1529. Ответов 8

Author24 — интернет-сервис помощи студентам
Среди столбцов заданной целочисленной матрицы, содержащих только элементы, которые по модулю не больше 10, найти столбец с минимальным произведением элементов. Расчет произведения организовать через функции.

Матрица А = [
1 2 1
19 3 -7
-1 3 5
];

Ответ А: "Это 3-й столбец"

Матрица B = [
-15 21
6 -12
];

Ответ В: "Таких столбцов нет"
Миниатюры
Найти столбец в матрице с минимальным произведением элементов  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2016, 23:21
Ответы с готовыми решениями:

В матрице найти столбец с минимальным произведением элементов
в двумерном массиве нужно найти столбец с минимальным произведением элементов

В матрице найти столбец с минимальным произведением элементов
Среди столбцов заданой целочисленной матрицы размером 7*7 найти столбец с минимальным произведением...

Найти столбец с минимальным произведением элементов.
Среди столбцов целочисленной матрицы А(n,m) найти столбец с минимальным произведением элементов.

Найти столбец с минимальным произведением элементов
1) Среди столбцов заданной целочисленной матрицы, содержащих только такие элементы, которые по...

8
65 / 65 / 47
Регистрация: 04.12.2016
Сообщений: 214
16.12.2016, 23:48 2
PHP
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
function findColumn(array $matrix) {
    $min = 0;
    $minIndex = -1;
 
    for($i = 0; $i < count($matrix); $i++) {
        $product = 1;
        $flag = true;
 
        for($j = 0; $j < count($matrix[$i]); $j++) {
            if(abs($matrix[$i][$j]) <= 10) {
                $product *= $matrix[$i][$j];
            } else {
                $flag = false;
                break;
            }
        }
 
        if($flag && $product < $min || $i == 0) {
            $min = $product;
            $minIndex = $i;
        }
    }
 
    return $minIndex + 1;
}
Функция возвращает индекс столбца. -1 - если такого столбца нет.
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.12.2016, 08:28 3
Vshining, вы по строкам считаете.
0
65 / 65 / 47
Регистрация: 04.12.2016
Сообщений: 214
18.12.2016, 13:56 4
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Vshining, вы по строкам считаете.
Действительно. Спасибо, что обратили внимание - еще пару ошибок в коде обнаружил.

PHP
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
function findColumn(array $matrix) {
    $min = 0;
    $minIndex = -2;
 
    for($i = 0; $i < count($matrix[0]); $i++) {
        $product = 1;
        $flag = true;
 
        for($j = 0; $j < count($matrix); $j++) {
            if(abs($matrix[$j][$i]) <= 10) {
                $product *= $matrix[$j][$i];
            } else {
                $flag = false;
                break;
            }
        }
 
        if($flag && ($product < $min || $i == 0)) {
            $min = $product;
            $minIndex = $i;
        }
    }
 
    return $minIndex + 1;
}
0
0 / 0 / 0
Регистрация: 20.02.2015
Сообщений: 69
18.12.2016, 23:21  [ТС] 5
пожалуйста, можете написать комментарии, чтоб я понял, что присходит тут
0
65 / 65 / 47
Регистрация: 04.12.2016
Сообщений: 214
19.12.2016, 13:43 6
PHP
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
function findColumn(array $matrix) {
    //Переменная, в которой будем хранить минимальное значение для текущего столбца ($i) на текущей строке ($j)
    $min = 0;
 
    //И его индекс
    $minIndex = -2;
 
    //Цикл по столбцам
    for($i = 0; $i < count($matrix[0]); $i++) {
        //Переменная, которая будет аккумулировать произведение элементов текущего столбца
        //Инициализирована единицей - нейтральным элементом для умножения
        $product = 1;
 
        //Флаг, который сообщает, что в столбце не было элементов, по модулю больших 10
        //Соответственно, его установкой в false мы исключаем текущее произведение из сравнения
        $flag = true;
 
        //Цикл по строкам
        for($j = 0; $j < count($matrix); $j++) {
            //Если модуль текущего элемента не больше 10 - домножаем произведение на него
            if(abs($matrix[$j][$i]) <= 10) {
                $product *= $matrix[$j][$i];
            } else {//Иначе - сбрасываем флаг и выходим из цикла $j (т.к. столбец уже не удовлетворяет условию)
                $flag = false;
                break;
            }
        }
 
        //Если флаг установлен (в столбце элементы по модулю не больше 10)
        //и в то же время текущее произведение меньше минимального или мы на первом столбце
        //(когда минимума предыдущих столбцов нет) - сохраняем новый минимум и новый индекс
        if($flag && ($product < $min || $i == 0)) {
            $min = $product;
            $minIndex = $i;
        }
    }
 
    //В начале программы эта переменная инициализирована -2, таким образом, чтобы при
    //случае, когда ни один столбец не удовлетворяет требованиям, возвращалась -1
    //а в остальных случаях - индекс столбца в индексации с единицы ($minIndex содержит номер столбца в 
    //0-индексации)
    return $minIndex + 1;
}
1
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
19.12.2016, 14:21 7
Цитата Сообщение от Vshining Посмотреть сообщение
PHP
1
$minIndex = -2;
Зачем поменяли?

Добавлено через 4 минуты
Цитата Сообщение от Vshining Посмотреть сообщение
PHP
1
2
3
4
//В начале программы эта переменная инициализирована -2, таким образом, чтобы при
//случае, когда ни один столбец не удовлетворяет требованиям, возвращалась -1
//а в остальных случаях - индекс столбца в индексации с единицы ($minIndex содержит номер столбца в 
//0-индексации)
Если возвращается индекс с единицы, то ноль уже будет говорить, что такого столбца нет
0
65 / 65 / 47
Регистрация: 04.12.2016
Сообщений: 214
19.12.2016, 14:24 8
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Зачем поменяли?
Чтобы если столбцов, удовлетворяющих условию нет, возвращалась -1. Вы ведь про -2? В конце просто добавляется 1, чтобы перейти из 0-индексации в требуемую 1-индексацию

Добавлено через 1 минуту
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Если возвращается индекс с единицы, то ноль уже будет говорить, что такого столбца нет
Действительно, и в условиях бы лучше работало. Пусть уже будет, для поддержания бдительности .
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
19.12.2016, 14:38 9
Лучший ответ Сообщение было отмечено Horosami как решение

Решение

Horosami, еще так можно, если версия PHP >= 5.5
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function findColumn(array &$arr)
{
    $minIndex = -1;
    $min = 0;
    foreach ($arr as $key => $value) {
        $column = array_column($arr, $key);
        if (empty(array_filter($column, function($item){ return abs($item) > 10; }))) {
            $product = array_product($column);
            if ($product < $min || $key == 0) {
                $minIndex = $key;
                $min = $product;
            }
        }
    }
    return $minIndex + 1;
}
1
19.12.2016, 14:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2016, 14:38
Помогаю со студенческими работами здесь

Найти столбец с минимальным произведением элементов
Среди столбцов заданной целочисленной матрицы, содержащих только такие элементы, которые по модулю...

Найти столбец с минимальным произведением элементов
Помогите пожалуйста программу создать, среди столбцов заданной целочисленной матрицы C размера 7 на...

Найти столбец матрицы с минимальным произведением элементов
Среди столбцов заданной целочисленной матрицы С размера 7на7, компоненты которой не превышают 10,...

Найти столбец с минимальным произведением элементов (усложнить)
Переделать программу на более полную мне кажеться что код написан простенько Среди столбцов...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru