Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 1, средняя оценка - 5.00
muckep
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
#1

Необычная выборка - Delphi

22.09.2010, 12:01. Просмотров 655. Ответов 9
Метки нет (Все метки)

Есть одномерный массив известной длины состоящий из чисел
Задается определенное число.
Задача. Выяснить, возможно ли получить это число путем сложения нескольких элементов данного массива, и если да, то каких.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2010, 12:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Необычная выборка (Delphi):

выборка в StringGrid - Delphi
Добрый день, Предположим, есть StringGrid (40 колонок на, примерно, 1000 строк), содержащий данные о заказах, оплатах и т.д... И...

Программа выборка - Delphi
Добрый день, нужна программа которая задает вопросы а человек отвечает "ДА" или "НЕТ". То есть - вопрос "У вас болит голова? " И варианты...

Выборка из строки - Delphi
Допустим задана строка 001012034, здесь в каждые 3 символа обозначают одно число, т.е. 001 = 1 012 = 12 034 = 34 Собственно и...

Выборка по массиву - Delphi
задача: есть массив из которого нужно извлечь порядковый номер в соответствии ключа. допустим некий массив arr:='Москва'; ...

Выборка из ComboBox - Delphi
Как реализовать выборку из ComboBox? Например если comboBox1.Items:='Компьютер' то Comp:='Computer'; if...

Выборка эл-ов в StringGrid - Delphi
Доброго вам. Задача такая. Таблица состоит из 4 столбцов и n строк. Нужно провести сделать следующее- Нужно поочередно выбрать все...

9
anonimus
2154 / 1243 / 32
Регистрация: 28.04.2010
Сообщений: 4,549
22.09.2010, 12:22 #2
вот
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const len=50;
var mas:array[0..len] of integer;
i,j,x:integer;
begin
Randomize;
for i:=0 to len do
mas[i]:=Random(len);
 
TryStrToInt(edit1.Text,x);
 
for i:=0 to high(mas) do
  for j:=0 to high(mas) do
  begin
    if  mas[i]+mas[j]=x then
    begin
     label1.Caption:='Положительно'+ #10#13+'результат будет верным при сложении '+inttostr(i)+' номера массива и '+inttostr(j)+#10#13+'mas['+inttostr(i)+']='+inttostr(mas[i])+#10#13+'mas['+inttostr(j)+']='+inttostr(mas[j]);
     break;
     end  else  label1.Caption:='Отрицательно';
  end;
end;
0
muckep
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
22.09.2010, 12:52  [ТС] #3
Я понял, что ты проверяешь сумму только двух элементов... а ведь данное число может состоять и из суммы трех, четырех, короче n элементов массива.
вот как раз в этом то и возникла сложность =(
0
Башир
207 / 207 / 1
Регистрация: 18.05.2010
Сообщений: 826
22.09.2010, 13:04 #4
Предлагаю это решить путем рекурсивной функции

Добавлено через 34 секунды
Если нужен код, то напишу только вечером.
1
muckep
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
22.09.2010, 13:21  [ТС] #5
Жду кода с нетерпением.
P.S. желательно с комментариями
P.P.S. Заранее спасибо
0
anonimus
2154 / 1243 / 32
Регистрация: 28.04.2010
Сообщений: 4,549
22.09.2010, 14:13 #6
уточни задание, число должны получить не обязательно из подряд идущих элементов?
т.е. если у нас массив
mas[0]=2
mas[1]=4
mas[2]=1
mas[3]=0
mas[4]=5
mas[5]=7
mas[6]=9
mas[7]=2
и у нас в эдит введено 20, то результат может быть таким:
mas[5]+mas[6]+mas[1] или таким mas[0]+mas[1]+mas[4]+mas[6]
просто если проверять по порядку массив может и не быть нужного числа, а если в разброс то будет.
0
muckep
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
22.09.2010, 15:46  [ТС] #7
в общем так
массив предположим выглядит так
mas[30,2,42,111,5,9,65,47,23,98,73]

Допустим ввели число 116
это будет сумма mas[4] и mas[5] (можно mas[5] и mas[4]) без разницы
а если ввели число 34
то это уже сумма mas[2] и mas[6] и mas[9] в любом порядке

если число можно получить несколькими способами (сложением 2х или 3х или 4х элементов) пофиг какой способ будет показан пользователю
0
Башир
207 / 207 / 1
Регистрация: 18.05.2010
Сообщений: 826
22.09.2010, 20:37 #8
Вот обещенный код. Работает под любой размер массива и находит первую попавщуюся комбинацию из которых получается сумма
Delphi
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
type
  TIntArray = array of Integer;
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure SeekSum(const SumForSeek: Integer; const A: TIntArray; var X: TIntArray);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  I   : Integer;
  S   : String;
  A, X: TIntArray;
begin
  SetLength(A, 10);
  A[0]:=2;
  A[1]:=120;
  A[2]:=784;
  A[3]:=64;
  A[4]:=31;
  A[5]:=201;
  A[6]:=151;
  A[7]:=458;
  A[8]:=12;
  A[9]:=9;
  SeekSum(201+129+31, A, X);
  if Length(X)=0
    then ShowMessage('Нет решения')
    else
      begin
        S:='Список индексов -> '+IntToStr(X[Low(X)]);
        for I := 1 to Length(X) - 1 do S:=S+', '+IntToStr(X[I]);
        ShowMessage(S);
      end;
end;
 
 
procedure TForm1.SeekSum(const SumForSeek: Integer; const A: TIntArray; var X: TIntArray);
var
  I, J: Integer;
  B   : TIntArray;
begin
  for I := 0 to Length(A) - 1 do
    for J := 0 to Length(A) - 1 do
      if (I<>J) and (A[I]+A[J]=SumForSeek) then
        begin
          SetLength(X, Length(X)+2);
          X[High(X)-1]:=I;
          X[High(X)]:=J;
          exit;
        end;
  SetLength(B, Length(A));
  for I := 0 to Length(A) - 1 do B[I]:=A[I];
  for I := 0 to Length(B) - 1 do
    begin
      if A[I]=0 then continue;
      B[I]:=0;
      SeekSum(SumForSeek-A[I], B, X);
      if Length(X)>0 then
        begin
          SetLength(X, Length(X)+1);
          X[High(X)]:=I;
          exit;
        end;
      B[I]:=A[I];
    end;
end;
Добавлено через 1 минуту
Кстати очень интересная задача для проверки способности создание математической модели и изобретательности алгоритмов , надо бы ее записать куда нибудь.
1
muckep
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
23.09.2010, 08:15  [ТС] #9
Огромное спасибо.
А то в моем городе (глубинка России) программеры не нужны, только если бд какую нить простенькую привязать... не кодил лет 7. все забыл. аж стыдно стало =))
еще раз спасибо!
p.s. anonimus тебе тоже спасибо за старание =))
0
Башир
207 / 207 / 1
Регистрация: 18.05.2010
Сообщений: 826
23.09.2010, 09:10 #10
Цитата Сообщение от muckep Посмотреть сообщение
не кодил лет 7. все забыл
Так эта задача скорее всего относится не к кодированию а к фундаментальному программированию т.е. создание алгоритмов - что у большинства нынешних программеров эта часть храмает. Умеют рисовать красивые формы и кнопки а в алгоритмах слабы и не развивают эту часть.
1
23.09.2010, 09:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2010, 09:10
Привет! Вот еще темы с ответами:

Выборка из массива... - Delphi
Знаю что вопрос наверняка сто раз задавался но все же Так вот, задача состоит в следующем, есть массива заполненный числами от 1 до 7....

Выборка CheckBox-ов - Delphi
Здравствуйте, подскажите пожалуйста, на форме есть 6 штук CheckBox, нужно добиться того, что бы при выборе двух любых CheckBox-ов остальные...

Фильтрация и выборка данных - Delphi
Подскажите пожалуйста как сделать как сделать фильтрацию и выборку данных в dbgrideh что бы можно было делать выборку и фильтрацию по...

Выборка из базы данных - Delphi
большая просьба есть база сделанная в ацесе . форму создал , привязал к ней таблицу все выбирается . А как сделать кнопку что бы она...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru