![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Подскажите как разделить число на не равные части?
Если конкретней, то есть массив размерности N, нужно сгенирировать массив размерности M, так, чтобы сумма значений элементов массивов была равна, но значения, в большинстве случаев, не совпадали. |
|
#2
|
||||
|
||||
|
Код:
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
|
|||
|
|||
|
Это не совсем то. Видимо не совсем правильно поставил вопрос.
Например есть массив целых чисел - (100, 256,13, 78), сумма значений элементов = 447. Задача - получить новый массив, задоной размерности n, сумма значений которого будет равна сумме значений первого массива. Например (50,50,203,69,75). Т.е. по сути задача сводится к тому, чтобы разделить 447 на n, случайных частей. В примере NumLock-a числа получаются очень близкими к исходным значениям. |
|
#4
|
||||
|
||||
|
Код:
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
|
||||
|
||||
|
Цитата:
![]() |
|
#6
|
||||
|
||||
ой... это же я... ![]() |
|
#7
|
|||
|
|||
|
@eXplorer
Как минимум на 3ем шаге можем получить суммы 3х первых больше необходимой.. (пример: сумма=300, первый шаг, например получаем 150, второй шаг, например 75, на третьем шаге получаем рандом от 225....) Неужто никто не сталкивался?)) надо для оформления обычной транспортной задачи) |
|
#8
|
||||
|
||||
|
в общем алгоритм такой: тупо генерим 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
|
|||
|
|||
|
@Pilot_Red
Спасибо большое, то что надо и отлично работает) Примерно так и думал, тока недодумал) |