Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > сложная математическая задача


Автор: kovalenko123 29.12.2010, 22:57
Привет всем программистам!
Можно ли как нибудь сделать такую штуку имеем число константу например 20 и 5 переменных так вот из низ надо случайным образом сгенерировать число 20 это как нибудь возможно? 

Автор: Данкинг 29.12.2010, 23:43
В смысле - разложить константу на пять слагаемых? Иначе тогда непонятно, откуда следует брать значения переменных.

Автор: superVad 30.12.2010, 10:48
Играли раньше в игру такую - в автобусе дают талончики, на них есть номер - так надо было, при помощи различных арифметических действий получить из цифр номера 100.

Автор: CROTishka 30.12.2010, 15:58
это скорее в "алгоритмы" надо было задавать.
и уточните задание - какие операции над числами возможны?

Автор: kovalenko123 30.12.2010, 20:47
Здравствуйте всем! 

Цитата

какие операции над числами возможны


Абсолютно любые лишь бы число получилось в сумме такое же как первое число

Есть такая идея 

к примеру поступает число 30 

я беру для каждой переменный случайное значение с помощью рандома от 1 до числа (которое требуется достич в конце ) (6 -- 30/5) поделенного на 5

и в цикле ифом сравниваю когда они совпадут делаю брейк это пока в теории.... как думаете на практике заработает?



Автор: Poseidon 3.1.2011, 10:13
Цитата(kovalenko123 @  30.12.2010,  20:47 Найти цитируемый пост)
и в цикле ифом сравниваю когда они совпадут делаю брейк это пока в теории.... как думаете на практике заработает?
А на практике возможен вечный цикл и, следовательно, зависание программы.

Лично я все-равно не понял что надо.
Цитата(kovalenko123 @  29.12.2010,  22:57 Найти цитируемый пост)
из низ надо случайным образом сгенерировать число 20

20 в сумме? В произведении? В разности? Может быть в корне или в квадрате? Напиши хоть пример что нужно получить.

Автор: kovalenko123 3.1.2011, 11:40
Цитата

Напиши хоть пример что нужно получить. 


Имеем число 22 а так же имеем 5 переменных с помощью которых мы получим конечно число 22 

к примеру 

x1 = 1
x2 = 10
x3 = 1
x4 = 5
x5 = 5
при следующем нажатии на кнопку те же переменные превратятся в 

x1 = 5
x2 = 5
x3 = 5
x4 = 5
x5 = 2

еще нажимаем они превращаются в 

x1 = 2
x2 = 5
x3 = 5
x4 = 8
x5 = 2

и тд


Автор: Poseidon 3.1.2011, 15:05
Т.е., как я вижу, сумму должны давать. Ну тут вообще все просто. Есть в Дельфи замечательная функция random.
Для первого числа берешь диапазон от 0 до (х-n+1), где х-это твое то самое число (22 в примере), n-количество ответов (5 в примере). Т.е., для твоего примера берешь диапазон от 0 до 18. В дельфи это будет выглядеть так: 
Код

randomize;
x1:= random(19);

Для второго числа уменьшаешь диапазон на величину первого числа. Т.е. от 0 до (х-n+1+х1). Для твоего примера:
Код

x1:= random(19+x1);

Для третьего числа уменьшаешь диапазон на сумму первых двух чисел. Т.е. от 0 до  (х-n+1+х1+х2).

Ну и так далее.

Автор: kovalenko123 6.1.2011, 11:14
Poseidon
Интересный метод сегодня попробую Большое спасибо!!!

Автор: Poseidon 6.1.2011, 11:33
Епть, написал "уменшаешь", а поставил +. Минус там надо...

Автор: ziga 13.1.2011, 09:51
Лучше немного переделать что бы исключить результаты с нолями:

Код

значения = 22

x1 = 22
x2 = 0
x3 = 0
x4 = 0
x5 = 0



вот код

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  x1, x2, x3, x4, x5, iNum : integer;
begin
  Randomize;
  iNum := StrToInt(Edit1.Text);
  x1 := Random(iNum - 4) + 1;
  x2 := Random(iNum - 3 - x1) + 1;
  x3 := Random(iNum - 2 - (x1 + x2)) + 1;
  x4 := Random(iNum - 1 - (x1 + x2 + x3)) + 1;
  x5 := Random(iNum - (x1 + x2 + x3 + x4)) + 1;
end;


в таком случае самый простой вориант будет выглядить:


Код

значения = 22

x1 = 18
x2 = 1
x3 = 1
x4 = 1
x5 = 1



Автор: morpheyushka 13.1.2011, 12:28
А зачем нули исключать...или это не числа?
вот мой вариант)))
Код

procedure TForm18.Button1Click(Sender: TObject);
var
  x1, x2, x3, x4, x5, iNum : Integer;
  Sum: Integer;
begin
  x1 := 0;
  x2 := 0;
  x3 := 0;
  x4 := 0;
  x5 := 0;
  Randomize;
  Sum := StrToIntDef(Edit1.Text, 0);
  x1 := Random(Sum + 1);
  if Sum <> x1 then begin
    x2 := Random(Sum + 1 - x1);
    if Sum <> (x1 + x2) then begin
      x3 := Random(Sum + 1 - x1 -x2);
      if Sum <> (x1 + x2 + x3) then begin
        x4 := Random(Sum + 1 - x1 - x2 - x3);
        if Sum <> (x1 + x2 + x3 + x4) then begin
          x5 := Sum - (x1 + x2 + x3 + x4);
        end;
      end;
    end;
  end;

  Memo1.Lines.Add(Format('x1 = %d', [x1]));
  Memo1.Lines.Add(Format('x2 = %d', [x2]));
  Memo1.Lines.Add(Format('x3 = %d', [x3]));
  Memo1.Lines.Add(Format('x4 = %d', [x4]));
  Memo1.Lines.Add(Format('x5 = %d', [x5]));
end;


Автор: kovalenko123 14.1.2011, 09:06
Ребята спасибо большое! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)