
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
Помогите пожалуйста! Паскаль!
|
||
| Философия, технологии, алгоритмы! |
![]() |
|
|
|
Опции темы |
|
|
#1 |
|
Форумец
Сообщений: 7
Регистрация: 02.03.2011
|
Помогите пожалуйста! Паскаль!
Среди строк матрицы, которые упорядочены по убыванию, напечатать номер строки с наименьшим произведением элементов.
Если не сложно напишите решение, последняя задача осталась и я не могу её решить. |
|
|
|
|
#2 |
|
Форумец
Сообщений: 286
Регистрация: 17.09.2010
|
Naiskosok, http://bvf.ru/forum/showthread.php?t=319756
На каком языке хоть? в каком формате ввод-вывод данных? P.S. Готов сделать за 200 рублей. |
|
|
|
|
#4 |
|
Глаза пучит
Сообщений: 1,689
Регистрация: 12.07.2003
Возраст: 58
|
За пузырь! Организм требует.
|
|
|
|
|
#7 |
|
Мы вместе
Сообщений: 917
Регистрация: 15.04.2005
Возраст: 42
|
Как вариант так:
Код:
//в примере элементы матрицы целочисленные
var
M : array[0..X, 0..Y] of Integer; //Матрица размером X на Y (не знаю, как там у вас)
N : array[0..X] of Integer; //Список значений произведений
Min : Integer; //Требуемый номер строки
MinValue : Integer; //Минимальное значение
I, J : Integer;
begin
//Считаем произведения
for I := 0 to X do
begin
N[I] := 1;
for J := 0 to Y do
N[I] := N[I] * M[I, J];
end;
//Находим минимальное значение
MinValue := N[0];
Min := 0;
for I := 1 to X do
if N[I] < MinValue then
begin
MinValue := N[I];
Min := I;
end;
//Выводим
WriteLn(Min);
end;
|
|
|
|
|
#8 |
|
Форумец
Сообщений: 153
Регистрация: 23.12.2006
|
Код:
int sum = 1 , min = 99999 , id = 0 ;
for (int i=0; i < n; i++ )
{
for (int j=0; j < m; j++ ) //n m - размерности
sum *=arr[i,j]; // произведение элементов одной строки
if (sum<min)
{
min=sum;
id = i;
}
if (i==0) min = sum;
sum = 1;
//id - строка с наименьшим произведением
}
Последний раз редактировалось demid; 07.03.2011 в 20:39. |
|
|
|
|
#10 |
|
Форумец
Сообщений: 153
Регистрация: 23.12.2006
|
логику, думаю можно проследить, синтаксис значения не имеет. На паскале давно ни че не писал.
И еще, не в обиду конечно, но ваш код это хороший пост для http://govnokod.ru |
|
|
|
|
#11 |
|
Форумец
Сообщений: 153
Регистрация: 23.12.2006
|
Код:
var
m : array[0..x, 0..y] of integer; //Матрица размером X на Y (не знаю, как там у вас)
id : integer; //Требуемый номер строки
mV : integer; //Минимальное значение
i , j , sum: integer;
begin
sum = 1;
mV := 999999;
for i := 0 to x do
begin
for j := 0 to y do
Sum := Sum * m[i, j]; //Считаем произведения
if (Sum < MinValue) then
begin
id : = i;
mV := sum;
end;
if (i=0) then mV := sum;
sum := 1;
end; // id - номер строки
end;
Последний раз редактировалось demid; 07.03.2011 в 20:39. |
|
|
|
|
#12 | |
|
Мы вместе
Сообщений: 917
Регистрация: 15.04.2005
Возраст: 42
|
Цитата:
1. 2 цикла и отдельный список для произведений в данном случае облегчают понятие алгоритма для новичка 2. Написали переменные в нижнем регистре? Посмотрите исходники и рекомендации Борланда или Эмбаркадеро: Код:
function TControl.GetDockEdge(MousePos: TPoint): TAlign;
function MinVar(const Data: array of Double): Integer;
var
I: Integer;
begin
Result := 0;
for I := Low(Data) + 1 to High(Data) do
if Data[I] < Data[Result] then Result := I;
end;
var
T, L, B, R: Integer;
begin
Result := alNone;
R := Width;
B := Height;
Говнокод? |
|
|
|
|
|
#13 |
|
Форумец
Сообщений: 153
Регистрация: 23.12.2006
|
В начале немного накасячил)) На счет понимание, даже и не знаю. По моему новичков нужно сразу учить писать по человечески, а то так и будут объявлять массивы для всех временных нужд. С такими "прозрачными умениями" их только кассиром или сис. админом в пятерочку возьмут. Я конечно не считаю себя богом кода, но в данном случаи делать массив под выборку всех произведений - это точно гавнокод. А на счет назвать переменную i или I , это кажется маразматическая придирка, разве нет? Тут-же нету перемнной типо "peremennayadlyashetchika1" ))
ps Нет войне. Что-бы дальше не было споров, скажу так. Я обдумал ваш код и считаю что он эталонный для этой задачи. |
|
|
|
|
#14 | |||
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Цитата:
Цитата:
Цитата:
Даже индус бы так не написал )) Ну ведь можно было что-то вроде этого изобразить... Код:
if (!i)
{
min_p=p;
ind = 0;
}
else if (p<min_p)
{
min_p=p;
ind=i;
}
И ещё, если есть произведение, его лучше "копить" его в переменной размерность которой больше перемножаемых элементов. Например в double. Дабы не вызвать переполнения, которое ты легко получишь при длинной строке массива. |
|||
|
|
|
|
#15 |
|
Out There
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47
|
|
|
|
|
|
#16 |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Согласен, это очень тонкий момент.
ну это если ты будешь дальше с ним работать то да, а если результат хранить, тем более зная что он может получится ОГРОМНЫЙ, то какой тут грех? |
|
|
|
|
#17 |
|
Форумец
Сообщений: 153
Регистрация: 23.12.2006
|
А кто, говорил что это C++ ))
1) В Шарпе можно обращаться к двумерному массиву в стиле аля Паскаль; 2) Шарп не приводит в if все подряд к логическому типу. На счет проверки i на 0, окей... спорить не буду, не самый лучший вид, но это однозначно более выгодно по сравнению с первым примером. А если уш совсем себя оправдать, то лишняя проверка на каждой терции, которая всегда будет ложной, особо сильно не нагрузит эту программу))) 3) Зачем брать double для произведения целых? Тогда уж long. Места занимают одинаково, но в данном случаи точность после запятой нас точно не волнует. ) Последний раз редактировалось demid; 07.03.2011 в 20:48. |
|
|
|
|
#18 | |||
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Цитата:
![]() Цитата:
Цитата:
Т.е. можно было и long взять.
|
|||
|
|
|
|
#21 | |
|
Out There
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47
|
основной - замедление вычислений. конечно, этот пример не показателен, но в более других случаях это может быть заметно. плюс - дабл имеет меньшее кол-во значащих цифр, чем тот же long long.
Цитата:
Интересно, топикстартеру все это пригодится? ) |
|
|
|
|
|
#22 |
|
Форумец
Сообщений: 286
Регистрация: 17.09.2010
|
|
|
|
|
|
#24 |
|
Out There
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47
|
точность больше лонга, но меньше лонг лонга. кстати, на 64-битных системах, int равен 64-битам, и в этом случае дабл будет хуже, потому что у него в это 64 бита еще и порядок входит. вообще, у дабла всего 15 значащих цифр.
|
|
|
|
|
#25 | |
|
Registered User
Сообщений: 1,113
Регистрация: 23.06.2007
Возраст: 58
|
Цитата:
Так собственно вопрос в другом что значит Среди строк матрицы, которые упорядочены по убыванию ?
|
|
|
|
|
|
#28 | |
|
Форумец
Сообщений: 340
Регистрация: 25.07.2002
|
Цитата:
как ты сам прекрасно понимаешь мы НЕ можем тупо перемножать элементы строки-в ПРОИЗВОЛЬНОЙ матрице мы не влезим ни в один тип(произведение будет расти быстрее даже факториальной функции). Упорядоченность строк убирает перестановки и соответственно более поздние элементы вносят больший вклад в произведение. На этом можно построить критерий оценки конечного произведения.Таким образом задачка перерождается в тупо сортировку N размерных "чисел"(строки матрицы) по модулю M(где N размерность строки по горизонтали, а M размерность одного элеента строки). Я бы в такой задаче применил поразрядную сортировку как более наглядную. Последний раз редактировалось MadFish; 09.03.2011 в 08:29. |
|
|
|
|
|
#29 |
|
Форумец
Сообщений: 44
Регистрация: 14.09.2010
|
Мне кажется большинсто отписавшихся забыли, что это всего - навсего СТУДЕНЧЕСКАЯ задача, которую надо тупо решить не анализируя постановку (она не должна обсуждаться - принимается как есть). Решение абсолютно простое и один из вариантов был приведен в посте DWanek. Может он и не оптимальный, но для сдачи сойдет.
А вставка поразрядной сортировки для сортировки уже отсортированных строк добавит минимум строк 30 - 40 в программный код и головную боль при сдаче. |
|
|
|
|
#30 |
|
Форумец
Сообщений: 340
Регистрация: 25.07.2002
|
Palych, Вот всегда умиляют меня такие выссказывания "которую надо тупо решить не анализируя постановку" ))) это сразу 5 с плюсом на любой даже школьной задаче))))Решать надо поставленную задачу, а не накладывать ограничения на условия, чтобы упростить себе жизнь.
Из приведенных не было ни одного правильного варианта решения поставленной задачи !!! Были приведены варианты решения ПОДОБНОЙ задачи, когда число элементов в строке не больше нескольких десятков и сами числа не больше 100, а это гораздо более узкая задача))) для справки факториал 255 ~3,35*10^504 (а это всего лишь строка БАЙТОВ а не Интежеров) а в double влезает ~10^308. решаем тупо дальше да? Последний раз редактировалось MadFish; 09.03.2011 в 10:15. |
|
|