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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2013, 21:21   #1
maratius
 
Регистрация: 04.06.2013
Сообщений: 9
По умолчанию Задача на последовательность 2

Помогите решить следующую задачу:
http://screencloud.net/img/screensho...ab66a0c969.png
Есть у меня такая идея: рассмотрим один член последовательности ab...cd. Если в нем есть числа 29, то их можно найти, также можно найти первую и последнюю цифры (они нужны для того, чтобы если предыдущий член посл. заканчивается на 2, а следующий начинается на 9, то это есть комбинация 29: 129292, 934 - к=3) :
Код:
var a,l,m,n,p,k:longint;
begin
 readln(n);
 l:=n mod 10;
 while n<>0 do begin
  a:=n mod 100;
  if a=29 then begin
   n:=n div 100;
   p:=2;
   k:=k+1; 
   if k>m then m:=k;
  end
  else begin
   p:=n mod 10;
   n:=n div 10; 
   k:=0;
  end;
 end;
 writeln(p:3,m:3,l:3)
end.
В итоге пришел к этому, дальше голова отказывается что-то искать и исправлять:
Код:
var a,l,m,n,l1,p,k:longint;
begin
readln(n);
while n<>0 do begin
 l1:=l;
 l:=n mod 10;
 while n<>0 do begin
  a:=n mod 100;
  if a=29 then begin
   n:=n div 100;
   p:=2;
   k:=k+1; 
   if k>m then m:=k;
  end
  else begin
   p:=n mod 10;
   n:=n div 10; 
   k:=0;
  end;
  if l1*10+p=29 then  k:=k+1; 
 end;
 readln(n);
end;
writeln(k:3);
end.
Помогите. Программа получилась большая, может есть способ легче? Из операторов можно использовать циклы, ветвления, причем циклы простые, без всяких замораживаний.

Последний раз редактировалось Stilet; 11.11.2013 в 21:50. Причина: спойлеры не работают -_-
maratius вне форума Ответить с цитированием
Старый 11.11.2013, 21:57   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Опа! А где сказано что в качестве элементов выступают цифры?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.11.2013, 22:00   #3
maratius
 
Регистрация: 04.06.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Опа! А где сказано что в качестве элементов выступают цифры?
Элементы последовательности - натуральные числа, они образуют последовательность, в которой и нужно исследовать подпоследовательности 29-ок. Цифры могут встречаться, как односоставные числа. Я так понял.
maratius вне форума Ответить с цитированием
Старый 11.11.2013, 22:55   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Что-то у Вас больно накручено. Вам просто нужно найти подпоследовательность из 29, т.е., например:
1 2 3 29 29 4 5 6 29 7 8 9 29 29 29 0
И выбрать из таких подпоследовательностей самую длинную (в примере последняя имеет максимальную длину).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 12.11.2013, 13:52   #5
maratius
 
Регистрация: 04.06.2013
Сообщений: 9
По умолчанию

Да! Чисел же. А я думал, что нужно анализировать последовательность, образованную вводящимися числами, и искать в ней комбинации цифр 2 и 9. Спасибо за пояснение.
maratius вне форума Ответить с цитированием
Старый 12.11.2013, 14:07   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Да! Чисел же.
точно так!

а вот и решение:
Код:
var
  k1, k2: integer;
  one : integer;

function max(a, b: integer): integer;
begin
  if a > b then
    max := a
  else
    max := b;
end;

begin
  k1 := 0;
  k2 := 0;
  read(one);
  while one<>0 do begin
    if one = 29 then begin
      k1 := k1 + 1;
      k2 := max(k1, k2)
    end
    else k1 := 0;
    read(one);
  end;
  writeln(k2);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.11.2013, 14:10   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда все проще:
Код:
repeat
 readln(i); 
 if i=29 then inc(cnt) else begin
  if cnt<max then max:=cnt;
  cnt:=0;
 end;
until i=0;
Ну или типа такого...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.11.2013, 16:01   #8
maratius
 
Регистрация: 04.06.2013
Сообщений: 9
По умолчанию

C разрешенным мне набором операторов получается так:
Код:
var k,m,n:longint;
 begin
 readln(n);
 while n<>0 do begin
  if n=29 then begin
   k:=k+1;
   if k>=m then
    m:=k;
   end
  else k:=0;
  readln(n);
 end;
 writeln(m);
end.
maratius вне форума Ответить с цитированием
Старый 12.11.2013, 16:19   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
C разрешенным мне набором операторов получается так:
перед чтением любой переменной эта переменная должна быть проиницилизированна!!
вот так, например:
Код:
var k,m,n:longint;
 begin
  k := 0;
  m := 0;
  readln(n);
  while n<>0 do begin
    if n=29 then begin
.....
p.s. Буратино дали два яблока. Сколько у него теперь яблок?
Ответ - неизвестно сколько, ведь мы не знаем, сколько у него было яблок в начале!!

p.p. s. я знаю, что у Вас и так сработало. Поверьте мне, это далеко не всегда будет. Да и по науке надо переменные иницилизировать!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.11.2013, 16:32   #10
maratius
 
Регистрация: 04.06.2013
Сообщений: 9
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
перед чтением любой переменной эта переменная должна быть проиницилизированна!!
вот так, например:
Код:
var k,m,n:longint;
 begin
  k := 0;
  m := 0;
  readln(n);
  while n<>0 do begin
    if n=29 then begin
.....
p.s. Буратино дали два яблока. Сколько у него теперь яблок?
Ответ - неизвестно сколько, ведь мы не знаем, сколько у него было яблок в начале!!

p.p. s. я знаю, что у Вас и так сработало. Поверьте мне, это далеко не всегда будет. Да и по науке надо переменные иницилизировать!
Да, это я знаю, просто торопился и воспользовался тем, что и так сработает.
maratius вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на последовательность maratius Паскаль, Turbo Pascal, PascalABC.NET 5 11.11.2013 18:31
Задача на последовательность makskovalko Помощь студентам 5 21.10.2013 22:41
задача на последовательность Gordan007 Помощь студентам 4 26.11.2011 03:13
задача на последовательность tcjkjl Паскаль, Turbo Pascal, PascalABC.NET 0 13.12.2010 13:48