![]() |
|
|
Регистрация | << Правила форума >> | 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
Спасибо большое, то что надо и отлично работает) Примерно так и думал, тока недодумал) |