Всем опять привет. Сёдня чё-то себя плохо чувствую, но всё=же
вообщемкак найти в двуммерном массиве , номера строк с наибольшой суммой элем( таких строк может быть несколько)
вот на что на меня хватило, а дальше нихнаю как сделать, помогите пожалуйста, буду очень благодарен.
то что смог написать:
program num_str;
const n=4;m=5;
var a:array[1..n,1..m] of integer;
i,j:1..m; s,max:integer; num_s:1..m;
Begin randomize; writeln('poluch nas');
……for i:=1 to n do
……for j:=1 to m do
……a[i,j]:=random(n-1)*2;
… for i:=1 to n do begin
….for j:=1 to m do
……write(a[i,j]:3);
……. writeln; end; max:=s;
……….for i:=1 to n do begin s:=0;
………. for j:=1 to m do
………. s:=s+a[i,j];
………. writeln('summa v ',i,' stroke =',s);end;
………. {ifs>max then begin max:=s; num_s:=i; end;
……….. writeln('max v ',num_s,' stroke');}
………. readln
End.
7 марта 2008 в 13:03
аха, понятно! Спасибо тебе!
7 марта 2008 в 12:05
Потому что тогда сумму надо снова считать в следующем цикле.
Попробуй так написать))):
program num_str;
const n=4;m=5;
var
a:array[1..n,1..m] of integer;
b:array[1..n] of integer;
j:1..m;
i,k:1..n;
sum,max:integer;
Begin
…writeln('poluch nas');
/*init*/
…randomize;
…for i:=1 to n do
……for j:=1 to m do
………a[i,j]:=random(n-1)*2;
/*source out*/
…for i:=1 to n do begin
……for j:=1 to m do
………write(a[i,j]:3);
……writeln;
…end;
/*action*/
…max:=0;
…for i:=1 to n do begin
……sum:=0;
……for j:=1 to m do
………sum:=sum+a[i,j];
……writeln('summa v ',i,' stroke =',sum);
……if sum>max then
………max:=sum;
…end;
…k=0;
…for i:=1 to n do begin
……sum:=0;
……for j:=1 to m do
………sum:=sum+a[i,j];
……if sum=max then begin
………k:=k+1;
………b[k]:=i;
……end;
…end;
/*result out*/
…for i:=1 to k do
……write(b[i],' ');
…readln;
End.
7 марта 2008 в 11:05
а тогда почему прога не работает с элементами (если sum[i] заменитьна sum)?
5 марта 2008 в 17:05
Массив нужен, чтобы второй раз не рассчитывать суммы, можно обойтись и без него. Как бы добавляем столбец к матрице и делаем меньше вычислений. В данной ситуации: за 16 байт памяти делаем на 20 сложений меньше.
5 марта 2008 в 17:03
Огромное спасибо, прога работает, а зачем массив sum[i]?
5 марта 2008 в 17:02
Попробуй так написать:
program num_str;
const n=4;m=5;
var
a:array[1..n,1..m] of integer;
b:array[1..n] of integer;
sum:array[1..n] of integer;
j:1..m;
i,k:1..n;
max:integer;
Begin
…writeln('poluch nas');
/*init*/
…randomize;
…for i:=1 to n do
……for j:=1 to m do
………a[i,j]:=random(n-1)*2;
/*source out*/
…for i:=1 to n do begin
……for j:=1 to m do
………write(a[i,j]:3);
……writeln;
…end;
/*action*/
…max:=0;
…for i:=1 to n do begin
……sum[i]:=0;
……for j:=1 to m do
………sum[i]:=sum[i]+a[i,j];
……writeln('summa v ',i,' stroke =',sum[i]);
……if sum[i]>max then
………max:=sum[i];
…end;
…k=0;
…for i:=1 to n do begin
……if sum[i]=max then begin
………k:=k+1;
………b[k]:=i;
……end;
…end;
/*result out*/
…for i:=1 to k do
……write(b[i],' ');
…readln;
End.
5 марта 2008 в 15:05
попоробую задать вопрос по другому:
Как правильно вывести ответ из номеров строк?
4 марта 2008 в 19:03
этот код, неясно, работает ли вообще:
…for k:=1 to k do
……write(b[k],' ');
лучше заменить на:
…for i:=1 to k do
……write(b[i],' ');
4 марта 2008 в 18:03
Во-первых:
На этих данных код будет работать неправильно:
1 1 1 1 1
2 2 2 2 2
2 2 2 2 2
1 1 1 1 1
Вывод будет:
1
2
3
а должен быть:
2
3
Во-вторых:
это: b:array[1..m] of integer; вроде как массив для номеров строк. непонятно почему в нем количество элементов равно количеству столбцов.
Возможное решение:
Нужно добавить массив для сумм. В первом цикле считать суммы и максимум. Сделать второй цикл, для того, чтобы вносить номера только нужных строк.
4 марта 2008 в 15:02
Леонид,прога работает, но вот выдаёт рез-т допустим:
2 2
а надо
2 4
4 марта 2008 в 13:02
Чем вариант не подходит то? у меня даже кажись циклов меньше чем у вас;) в таком нечитабельном коде я не буду разбиратся
3 марта 2008 в 23:01
пример форматирования (заменять три точки на пробелы или табы), + немного поправил:
program num_str;
const n=4;m=5;
var
a:array[1..n,1..m] of integer;
b:array[1..m] of integer;
i:1..n;
j:1..m;
k:1..m
s:integer;
max:integer;
num_s:1..n;
Begin
…writeln('poluch nas');
/*init*/
…randomize;
…for i:=1 to n do
……for j:=1 to m do
………a[i,j]:=random(n-1)*2;
/*source out*/
…for i:=1 to n do begin
……for j:=1 to m do
………write(a[i,j]:3);
……writeln;
…end;
/*action*/
…max:=0;
…k:=0
…for i:=1 to n do begin
……s:=0;
……for j:=1 to m do
………s:=s+a[i,j];
……writeln('summa v ',i,' stroke =',s);
……if s>max then begin
………max:=s;
………num_s:=i;
………k:=0
……end;
……if s=max then
………k:=k+1;
……b[k]:=num_s;
…end;
/*result out*/
…writeln('max=',max,' nomer str=',num_s);
…for k:=1 to k do
……write(b[k],' ');
…readln
End.
не понятен, правда, вывод результатов (в том отношении, что один из них выводится дважды)
3 марта 2008 в 22:05
мне, например, не нравится вот это:
i,j,k:1..m
…
… for i:=1 to n do
и стиль форматирования
3 марта 2008 в 15:01
спасибо конечно, но этот вариант не подходит(
вот мой переделанный вариант, может кто ещё поможет.
program num_str;
const n=4;m=5;
var a:array[1..n,1..m] of integer; b:array[1..m] of integer;
i,j,k:1..m; s,max:integer; num_s:1..n;
Begin randomize; writeln('poluch nas');
… for i:=1 to n do
… for j:=1 to m do
…. a[i,j]:=random(n-1)*2;
….for i:=1 to n do begin
…..for j:=1 to m do
…… write(a[i,j]:3);
…….writeln; end;
………max:=0;
……….. for i:=1 to n do begin s:=0;
………..for j:=1 to m do
………….. s:=s+a[i,j];
…………writeln('summa v ',i,' stroke =',s);
………………. ifs>max then begin max:=s; num_s:=i;end;
…………………if s=max thenk:=k+1; b[k]:=num_s; end;
……………… writeln('max=',max,' nomer str=',num_s);
……………….. for k:=1 to k do
……………… write(b[k],' ');
readln
End.
2 марта 2008 в 17:04
Если ваще не думаю и не оптимизируя и тупо, то вот что первое пришло в голову:
max:=0;
sum:=0;
for i:=1 to n do
begin
for j:=1 to m do
begin
sum:=sum+a[i,j];
end;
if (sum>max) then max:=sum;
sum:=0;
end;
for i:=1 to n do
begin
for j:=1 to m do
begin
sum:=sum+a[i,j];
end;
if (sum=max) then writeln(i);
sum:=0;
end;
где все переменные интеджеры, а массив н*м тож инт, забьешь сам.
Не тестил но думаю работает:)