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