Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
1

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

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

Author24 — интернет-сервис помощи студентам
Есть одномерный массив известной длины состоящий из чисел
Задается определенное число.
Задача. Выяснить, возможно ли получить это число путем сложения нескольких элементов данного массива, и если да, то каких.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2010, 12:01
Ответы с готовыми решениями:

Необычная выборка с сортировкой
Здравствуйте! У меня такая задача:

Необычная выборка из нескольких таблиц
Есть две таблички: DROP TABLE IF EXISTS `m`; CREATE TABLE `m` ( `student_id` mediumint(9)...

Выборка без ключевых слов/Выборка без столбцов/Выборка с условием
Нужно сделать 2 типа выборки в отдельный столбец: #1 без ключевых слов типа "АРБУЗ, ДЫНЯ" #2 без...

Необычная аппроксимация
Добрый день, коллеги. Есть следующая задача: существует набор точек (x, y). Пусть такой: x y 1...

9
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
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
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
22.09.2010, 12:52  [ТС] 3
Я понял, что ты проверяешь сумму только двух элементов... а ведь данное число может состоять и из суммы трех, четырех, короче n элементов массива.
вот как раз в этом то и возникла сложность =(
0
215 / 215 / 20
Регистрация: 18.05.2010
Сообщений: 865
22.09.2010, 13:04 4
Предлагаю это решить путем рекурсивной функции

Добавлено через 34 секунды
Если нужен код, то напишу только вечером.
1
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
22.09.2010, 13:21  [ТС] 5
Жду кода с нетерпением.
P.S. желательно с комментариями
P.P.S. Заранее спасибо
0
2184 / 1254 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
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
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
215 / 215 / 20
Регистрация: 18.05.2010
Сообщений: 865
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
0 / 0 / 0
Регистрация: 22.09.2010
Сообщений: 5
23.09.2010, 08:15  [ТС] 9
Огромное спасибо.
А то в моем городе (глубинка России) программеры не нужны, только если бд какую нить простенькую привязать... не кодил лет 7. все забыл. аж стыдно стало =))
еще раз спасибо!
p.s. anonimus тебе тоже спасибо за старание =))
0
215 / 215 / 20
Регистрация: 18.05.2010
Сообщений: 865
23.09.2010, 09:10 10
Цитата Сообщение от muckep Посмотреть сообщение
не кодил лет 7. все забыл
Так эта задача скорее всего относится не к кодированию а к фундаментальному программированию т.е. создание алгоритмов - что у большинства нынешних программеров эта часть храмает. Умеют рисовать красивые формы и кнопки а в алгоритмах слабы и не развивают эту часть.
1
23.09.2010, 09:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2010, 09:10
Помогаю со студенческими работами здесь

Необычная таблица
Как сделать такую таблицу?

Необычная таблица
Уважаемые форумчане! Подскажите, как такое сделать Схема таблицы: |A1|A2 | |A3 |A4|...

Необычная музыка
Люблю самую разную музыку. Желательно, чтоб она не была привязана ко времени и была странноватой....

необычная ссылка
Подскажите, пожалуйста, если кто-нибудь знает: Заходим на страницу...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru