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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2012, 21:10   #1
A_L_E_N_K_A
 
Регистрация: 28.11.2010
Сообщений: 7
По умолчанию не понятен алгоритм(((

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

дан целочисленный массив .найти в нем подпоследовательность максимальной длинны,представляющую собой арифметическую прогрессию.
A_L_E_N_K_A вне форума Ответить с цитированием
Старый 13.03.2012, 21:20   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Не понимаете как выявить арифметическую прогрессию?
или что?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 13.03.2012, 22:01   #3
A_L_E_N_K_A
 
Регистрация: 28.11.2010
Сообщений: 7
По умолчанию

да,как найти эту последовательность?
A_L_E_N_K_A вне форума Ответить с цитированием
Старый 13.03.2012, 22:28   #4
ByAlex
Форумчанин
 
Аватар для ByAlex
 
Регистрация: 15.03.2011
Сообщений: 465
По умолчанию

Цитата:
Сообщение от A_L_E_N_K_A Посмотреть сообщение
да,как найти эту последовательность?
Для начала вычитаешь из второго элемента первый - это будет шаг. Если остальные элементы больше или меньше предыдущего на этот шаг, то это и будет арифметическая прогрессия! Например, 3 6 9 12 15 ...
Помог - жми на весы!
ByAlex89@mail.ru
ByAlex вне форума Ответить с цитированием
Старый 13.03.2012, 22:30   #5
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

И ещё такой момент как
Если длина последовательности больше или равно двух
То у вас как минимум два элемента прогрессии есть в любом случае
(ну это так)
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 14.03.2012, 07:03   #6
A_L_E_N_K_A
 
Регистрация: 28.11.2010
Сообщений: 7
По умолчанию

это понятно,
а вот как заставить программу понять,что например 1 2 3 4 6 8 1 2 1 1 1 1 4 8 12 16 20
из этого что -то вообще лишнее,а где- то прогрессия,в которой больше элементов
A_L_E_N_K_A вне форума Ответить с цитированием
Старый 14.03.2012, 08:42   #7
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

берешь первые 2 элемента.
ищешь шаг прогрессии как к = а(2)-а(1)
дальше бежишь циклом от 3 элемента до последнего.
если a(n)-a(n-1)=к, значит все еще элементы прогрессии.
если a(n)-a(n-1) <> к, значит прогрессия закончилась элементом a(n-1). Прерываем работу цикла.
Вроде ничего не перепутал
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?
Wicort вне форума Ответить с цитированием
Старый 14.03.2012, 08:53   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

в коде выглядит как-то так:
Код:
var A : array[1..N] of integer;
    I, J, Step, Len, MaxLen : Integer;
begin
...
MaxLen := 0;
I:=1;
While I < N - MaxLen do
  begin
     J := I+1;
     Step := A[I] - A[J];
     Len := 1;
     repeat
        J := J + 1;
        Len := Len + 1;
     until A[J] - A[J-1] <> Step;
     If Len > MaxLen then MaxLen := Len;
     I := I + 1;
  end;
end.
upd.
Спасибо, Серж! Забыл про границу массива. Хотя равенство здесь необязательно
Цитата:
While I <= ( N - MaxLen ) do
не имеет смысла вычислять последовательность с такой же длиной, как уже найдена.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 14.03.2012 в 11:29.
DiemonStar вне форума Ответить с цитированием
Старый 14.03.2012, 10:26   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если довести до ума алгоритм DiemonStar,
получаем такой код:
Код:

const N = 17;
const B : array[1..N] of integer = (1,2,3,4,6,8,10,1,2,1,1,1,4,8,12,16,20);

var A : array[1..N] of integer;
    I, J, Step, Len, MaxLen : Integer;
    MaxLenStartPos : integer;
begin
  for i:=1 to N do A[i] := B[i];

  MaxLen := 0;
  I:=1;
  While I <= ( N - MaxLen ) do
    begin
       J := I+1;
       Step := A[J] - A[I];
       Len := 1;
       repeat
          inc(j);
          inc(Len);
       until (j>N) or (A[J] - A[J-1] <> Step);
       If Len > MaxLen then begin
          MaxLen := Len;
          MaxLenStartPos := I;
       end;
       if Len > 1 then
         I := I + Len - 1
       else
         Inc(I)
    end;

  WriteLn('макс.длина = ',MaxLen, ' начиная с позиции ', MaxLenStartPos);
  readln

end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.03.2012, 17:32   #10
A_L_E_N_K_A
 
Регистрация: 28.11.2010
Сообщений: 7
По умолчанию

так.хорошо,за это спасибо,но вот если задача стоит на с++ написать,там же нельзя сделать безразмерный массив
A_L_E_N_K_A вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С. Вывод символьного массива - результат удручающе не понятен Алексей Денисов Помощь студентам 5 05.07.2011 10:30
Конвертор валют... не понятен принцип работы mid Помощь студентам 7 25.02.2011 23:33
не понятен смысл функции *.getTime() IQDDD JavaScript, Ajax 4 23.06.2009 19:03
не понятен урок! Инспектор ГУЛ Помощь студентам 9 28.05.2009 14:13
Не понятен вопрос(системное программирование) student_63 Помощь студентам 2 03.04.2008 20:21