Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.03.2011, 18:40
iflight iflight вне форума
Прохожий
 
Регистрация: 20.03.2011
Адрес: Сыктывкар
Сообщения: 4
Репутация: 10
По умолчанию Деление числа на НЕ равные части

Подскажите как разделить число на не равные части?
Если конкретней, то есть массив размерности N, нужно сгенирировать массив размерности M, так, чтобы сумма значений элементов массивов была равна, но значения, в большинстве случаев, не совпадали.
Ответить с цитированием
  #2  
Старый 20.03.2011, 19:07
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  n0, n1, n2: Integer;
begin
  n0:=79;
  n1:=n0 div 2;
  n2:=n0-n1;
  Memo1.Lines.Add(IntToStr(n0));
  Memo1.Lines.Add(IntToStr(n1));
  Memo1.Lines.Add(IntToStr(n2));
  Memo1.Lines.Add(IntToStr(n1+n2));
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 20.03.2011, 20:05
iflight iflight вне форума
Прохожий
 
Регистрация: 20.03.2011
Адрес: Сыктывкар
Сообщения: 4
Репутация: 10
По умолчанию

Это не совсем то. Видимо не совсем правильно поставил вопрос.
Например есть массив целых чисел - (100, 256,13, 78), сумма значений элементов = 447. Задача - получить новый массив, задоной размерности n, сумма значений которого будет равна сумме значений первого массива. Например (50,50,203,69,75).
Т.е. по сути задача сводится к тому, чтобы разделить 447 на n, случайных частей.

В примере NumLock-a числа получаются очень близкими к исходным значениям.
Ответить с цитированием
  #4  
Старый 20.03.2011, 20:26
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

Код:
begin
edit1.Text:='447';
randomize;
edit2.Text:=inttostr(random(strtoint(edit1.Text)));
edit3.Text:=inttostr(random(strtoint(edit1.Text)-strtoint(edit2.Text)));
edit4.Text:=inttostr(random(strtoint(edit1.Text)-strtoint(edit2.Text)+strtoint(edit3.Text)));
edit5.Text:=inttostr(random(strtoint(edit1.Text)-strtoint(edit2.Text)+strtoint(edit3.Text)-strtoint(edit4.Text)));
end;
__________________
Ответить с цитированием
  #5  
Старый 20.03.2011, 20:32
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от eXplorer
Код:
begin
edit1.Text:='447';
randomize;
edit2.Text:=inttostr(random(strtoint(edit1.Text)));
edit3.Text:=inttostr(random(strtoint(edit1.Text)-strtoint(edit2.Text)));
edit4.Text:=inttostr(random(strtoint(edit1.Text)-strtoint(edit2.Text)+strtoint(edit3.Text)));
edit5.Text:=inttostr(random(strtoint(edit1.Text)-strtoint(edit2.Text)+strtoint(edit3.Text)-strtoint(edit4.Text)));
end;
eXplorer не хотел бы тебя опять поправлять... но по-моему ты опять х..ю написал
Ответить с цитированием
  #6  
Старый 20.03.2011, 20:46
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

ой...

это же я...
__________________
Ответить с цитированием
  #7  
Старый 20.03.2011, 22:31
iflight iflight вне форума
Прохожий
 
Регистрация: 20.03.2011
Адрес: Сыктывкар
Сообщения: 4
Репутация: 10
По умолчанию

@eXplorer
Как минимум на 3ем шаге можем получить суммы 3х первых больше необходимой..
(пример: сумма=300, первый шаг, например получаем 150, второй шаг, например 75, на третьем шаге получаем рандом от 225....)

Неужто никто не сталкивался?)) надо для оформления обычной транспортной задачи)
Ответить с цитированием
  #8  
Старый 21.03.2011, 00:17
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

в общем алгоритм такой: тупо генерим 5 случайных чисел(в твоем примере от 0 до 447). сохраняем их в массив. этот массив отсортировывем. а потом собственно получаем диапазоны, то есть твои части))

в принципе можно столкнуться с такой проблемой, что может сгенерится одинаковые числа, но это не страшно, просто какие-то компоненты одинаковые будут. да и проверку можно вставить непосредственно перед генерацией элемента.


Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  m:array[1..4] of integer;
  i,j,n,r2,r,temp:integer;
begin
   randomize;
   n:=4;
   r:=0;
   r2:=0;
for i:=1 to n-1 do
begin
  m[i]:=random(447);
    for j:=1 to i do
      if m[i]<m[j] then
      begin
        temp:=m[i];
        m[i]:=m[j];
        m[j]:=temp;
    end;
end;
 m[4]:=447;
 for i:=1 to n do
begin
r:=(m[i]-r2);
r2:=m[i];
m[i]:=r;
end;
form1.Caption:='';
for i:=1 to 4 do
 form1.Caption:= form1.Caption+inttostr(m[i])+';';
end;
Ответить с цитированием
  #9  
Старый 21.03.2011, 01:38
iflight iflight вне форума
Прохожий
 
Регистрация: 20.03.2011
Адрес: Сыктывкар
Сообщения: 4
Репутация: 10
По умолчанию

@Pilot_Red
Спасибо большое, то что надо и отлично работает) Примерно так и думал, тока недодумал)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter