Помощь - Поиск - Пользователи - Календарь
Полная версия: Одномерный массив
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
barlog
Для данного одномерного массива укажите индексы тех его элементов, сумма которых равна заданному числу(если такие есть). Найдите все наборы элементов, удовлетворяющих условию задачи.
Помогите плиз! Чё то и с формулировкой не всё ясно мне. Буду благодарен любой помощи!
volvo
Массив: <1, 2, 3, 6, 7, 8>
Заданное число = 16

Какие элементы массива дают в сумме 16?
Перечисли ВСЕ комбинации, только печатай НЕ сами элементы, а их индексы, т.е.
вместо <1, 7, 8> будет <1, 5, 6>
вместо <3, 6, 7> будет <3, 4, 5>

Чуть раньше была тема про разложение на слагаемые, она тебе может помочь, загляни в нее...
barlog
Спасибо, постараюсь найти тему. Если ничего не получиться напишу.
barlog
Нашёл тему о разложение числа на слагаемые.
Вот один из способов заполнения массива
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
Ну, например, вот такой вариант прекрасно отрабатывает на том примере, который я привел во втором посте:
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;

  find(n,n,1);
  readln
end.
Вот так это выглядит:
Цитата(Console)
n = 16
arr[ 1] = 1
arr[ 2] = 2
arr[ 3] = 3
arr[ 4] = 6
arr[ 5] = 7
arr[ 6] = 8
5 4 2 1
5 4 3
6 4 2
6 5 1
(индексы, правда, выводятся в порядке, соответствующем от большего элемента массива к меньшему - хотя индексы как раз можно и пересортировать, они могут выводиться в любом порядке - и существует ограничение: элементы массива - типа Byte, т.е. в интервале 0 .. 255, но я думаю, тебе этого хватит...)
barlog
Спасибо! Всё работает! Но кроме smallint аписал везде integer. Т.к паскаль не распазнают что такое smallint.
Вопрос закрыт! Ещё раз спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.