Для данного одномерного массива укажите индексы тех его элементов, сумма которых равна заданному числу(если такие есть). Найдите все наборы элементов, удовлетворяющих условию задачи. Помогите плиз! Чё то и с формулировкой не всё ясно мне. Буду благодарен любой помощи!
volvo
24.10.2006 0:58
Массив: <1, 2, 3, 6, 7, 8> Заданное число = 16
Какие элементы массива дают в сумме 16? Перечисли ВСЕ комбинации, только печатай НЕ сами элементы, а их индексы, т.е. вместо <1, 7, 8> будет <1, 5, 6> вместо <3, 6, 7> будет <3, 4, 5>
Чуть раньше была тема про разложение на слагаемые, она тебе может помочь, загляни в нее...
barlog
24.10.2006 23:03
Спасибо, постараюсь найти тему. Если ничего не получиться напишу.
barlog
26.10.2006 2:45
Нашёл тему о разложение числа на слагаемые. Вот один из способов заполнения массива
Uses Crt; var m,k: integer; x: array[1..100] of integer; begin clrscr; writeln('vvedite razmer massiva'); readln(M); k:=1; while (k<=m) do begin write('x(',k,')='); readln(x[k]); k:=k+1 end; for k:=1 to m do write (x[k]:2); readln end.
А вот ваша процедура
Uses Crt; var n: integer; c: array[1..100] of integer; print: boolean;
const diapazon: set of byte = [1,2,3,5];
procedure find(num,k,len: integer); var i: integer; begin if num=0 then begin print := true; for i := 1 to pred(len) do if not (c[i] in diapazon) then print := false;
if print then begin for i:=1 to len-1 do write(c[i],' '); writeln end; end else begin for i:=1 to k do if num-i>=0 then begin c[len]:=i; find(num-i,i,len+1); end; end; end;
begin clrscr; writeln('vvedite chiso'); readln(n); find(n,n,1); readln end.
Допустим, после заполнения массива вводим нужное число n. А как теперь подключить процедуру которая переберёт все варианты слагаемых составляющее это число и выведет их номера? Так как число n должно состоять из слагаемых входящих в массив, то они должны параллельно вводиться в diapason? { diapason: set of byte [1,5,7]??? } Т.е массив из {1,5,7} Вводим число 8. {1,1,1,1,1,1,1,1} {5,1,1,1} {7,1} И выводит их индексы {1} {2,1} {3,1} ?????????? Помоги, пожалуйста, с реализацией! Что-то вообще запутано! Если есть время конечно. Буду очень благодарен! Спасибо за предоставленную помощ!
volvo
26.10.2006 3:52
Ну, например, вот такой вариант прекрасно отрабатывает на том примере, который я привел во втором посте:
var n: integer; print: boolean;
const size = 6; cSize = 100; type T = array[1 .. size] of integer; cType = array[1 .. cSize] of smallint;
var arr: T; c: cType;
const diapazon: set of byte = [];
function contains(myArray: T; const cArr: cType; const len: integer; var indexes: T): boolean; var i, j: integer; found: boolean; index: integer; begin
index := 0;
contains := false; for i := 1 to len do begin
found := false; for j := 1 to high(T) do if myArray[j] = c[i] then begin found := true; myArray[j] := -1; inc(index); indexes[index] := j; break end;
if not found then exit; end; contains := true;
end;
procedure find(num,k,len: smallint); var i: smallint; indexes: T; begin if num=0 then begin print := true; for i := 1 to pred(len) do if not (c[i] in diapazon) then print := false;
if print and (len <= size + 1) then begin
if contains(arr, c, len - 1, indexes) then begin { for i:=1 to len-1 do write(c[i],' '); writeln } for i:=1 to len-1 do write(indexes[i]:3); writeln end;
end; end else begin for i:=1 to k do if num-i>=0 then begin c[len]:=i; find(num-i,i,len+1); end; end; end;
var i: integer; begin write('n = '); readln(n); { n := 6; } for i := 1 to size do begin write('arr[', i:2, '] = '); readln(arr[i]); include(diapazon, arr[i]); end;
(индексы, правда, выводятся в порядке, соответствующем от большего элемента массива к меньшему - хотя индексы как раз можно и пересортировать, они могут выводиться в любом порядке - и существует ограничение: элементы массива - типа Byte, т.е. в интервале 0 .. 255, но я думаю, тебе этого хватит...)
barlog
26.10.2006 20:32
Спасибо! Всё работает! Но кроме smallint аписал везде integer. Т.к паскаль не распазнают что такое smallint. Вопрос закрыт! Ещё раз спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.