Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2012, 19:03   #1
chipesca
 
Регистрация: 16.05.2012
Сообщений: 7
Восклицание Циклы и массив

Помогите пожалуйста, вот с какой задачкой:
всего 36 элементов каждый из которых может принимать значения 0,1,2. Задача заключается в следующем, перебрать все возможные варианты 36 элементов(всего их 36^3).

Код:
uses crt;
var j3,j2,j1 : word;
c : char;
  procedure start;
  var j3,j2,j1 : word;
     begin
     j3 := 0;
     j2 := 0;
     j3 := 0;
       repeat
       begin
           gotoxy(1,1);
           write(j3,j2,j1);
           inc(j1);
           if j1=3 then
               begin
                   inc(j2);
                   j1 := 0;
                   if j2=3 then
                       begin
                           j2 := 0;
                           inc(j3);
                       end;
               end;

           if keypressed then
           if readkey = #27 then break;
           delay(1000);
       end;
       until j3=3;
     end;
begin
clrscr;
   repeat
   clrscr;
   writeln('1 - start, Esc - Exit');
   c := readkey;
   case c of
   '1' : start;
 end;
until c=#27;
End.
Это пример для 3 элементов.
Мне необходимо для 36 и что бы они были заданы через массив.
Заранее спасибо.
chipesca вне форума Ответить с цитированием
Старый 16.05.2012, 22:16   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Все верно. Только вместо j1,j2,j3 - массив из нужного количества элементов. И проход по нему циклом.
Только Вы представляете, что такое 3^36? Результат потребует 5 эксабайт памяти.
s-andriano вне форума Ответить с цитированием
Старый 17.05.2012, 05:21   #3
chipesca
 
Регистрация: 16.05.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от s-andriano Посмотреть сообщение
Все верно. Только вместо j1,j2,j3 - массив из нужного количества элементов. И проход по нему циклом.
Только Вы представляете, что такое 3^36? Результат потребует 5 эксабайт памяти.
Проблема в том, что я строю массив, делаю цикл и она не делает то что нужно Я вот написал сюда, потому что делал и ни чего не сделал.
chipesca вне форума Ответить с цитированием
Старый 17.05.2012, 08:55   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

задачу можно решить разными вариантами.
Т.к. в данном случае все варианты перебора по сути есть очердные числа в 3-й системе счисления, то можно так и написать:
Код:
uses Crt;

procedure Start;
const
  MaxCount = 3; {число чисел в выборке - тут можно поставить любое число. например, 36}
  MaxBaseNumber = 2; {основание перебора! допускаем только цифры 0,1,2 }
var
  MasVar: array[1..MaxCount] of byte;
  i, j, perenos: integer;

begin
  {начальное задание - первый вариант - все нули}
  for j := 1 to MaxCount do MasVar[j] := 0;


  repeat
    {вывести вариант на экран}
    { gotoxy(1,1); }
    for j := 1 to MaxCount do Write(MasVar[j]);
    WriteLn;

       {найдём следующее сочетание. для этого добавим единичку в младший разряд}
    perenos := 1;
    for j := MaxCount downto 1 do begin
      MasVar[j] := (MasVar[j] + perenos);
      if MasVar[j] > MaxBaseNumber then
      begin perenos := 1; MasVar[j] := 0; end
      else perenos := 0;
    end;

    if perenos > 0 then begin
      WriteLn('Все варианты перебраны. Конец!');
    end;

    if keypressed then
      if readkey = #27 then
         begin WriteLn; Writeln('Прервано пользователем.'); break; end;
    delay(200);

  until perenos = 1;

end;


begin
  ClrScr;
  Start;
  Readln
end.
p.s. Вы не ответили, понимаете ли Вы, что для 3^36 вам потребуется прмерно 150094635296999121 секунд (если будете выдавать один вариант в секунду), это примерно 4 756 211 983 лет.... Вы уверены, что дождётесь окончания перебора?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.05.2012, 10:52   #5
chipesca
 
Регистрация: 16.05.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. Вы не ответили, понимаете ли Вы, что для 3^36 вам потребуется прмерно 150094635296999121 секунд (если будете выдавать один вариант в секунду), это примерно 4 756 211 983 лет.... Вы уверены, что дождётесь окончания перебора?!
Спасибо, за решение. Отвечаю на вопрос, элементов не 3^36, а 36^3 это 46656 вариантов и delay(1000) был сделан дабы видеть, как программа перебирает элементы. Так что в окончательном варианте его не буде,и я дождусь.
chipesca вне форума Ответить с цитированием
Старый 17.05.2012, 11:15   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Вы не знаете правил комбинаторики?
Если позиций 36, и на каждой позиции может быть 3 варианта, то всего будет 3^36 вариантов, а не 36^3. А то, что иногда эти числа совпадают, ничего не значит.
Например:
у вас 3 бита информации, т.е. 3 элемента с вариантами 0 и 1
мы можем получить 8 вариантов, т.е. 2^3, а не 3^2
000
001
010
011
100
101
110
111
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.05.2012, 11:55   #7
chipesca
 
Регистрация: 16.05.2012
Сообщений: 7
По умолчанию

Извиняюсь, их на самом деле 3^36, это печально...
chipesca вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С# задан массив 5х5. сформировать массивы А и В. в массив А поместить элементы с четными индексами, в массив В с нечетны Koksa Помощь студентам 0 10.10.2011 11:26
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26
Циклы Chuvak ot dushi Помощь студентам 2 14.10.2010 21:03
циклы. chertovka. Помощь студентам 1 25.06.2010 07:02
Циклы - вложенны циклы? tigga Microsoft Office Excel 5 19.02.2010 23:36