Страница 1 из 1

Решите, пожалуйста, задачку

Добавлено: 27 июн 2005, 20:14
scorpi.on
«Незнайка учится считать»

Входной файл: Nаtur.in
Выходной фаЙЛ: Natur.out
Время тестирования 1 секунда

Незнайка изучал арифметику- Знайка решил проверить, как Незнайка усвоил тему
«Натуральные числа» и предложил ему решить следующую задачу.
Задана последовательность, состоящая из десятичных цифр и не содержащая
пробелов. Помогите Незнайке найти среди этих цифр самую длинную (по
количеству чисел) непрерывную последовательность, состоящую из подряд
идущих натуральных чисел.
Если существует несколько последовательностей максимальной длины,
содержащих подряд идущие натуральные числа, то необходимо найти ту» которая
заканчивается самым большим числом.

Формат входных данных:

Входной файл Natur.in содержит произвольную последовательность десятичных
цифр (не более 255 цифр), не содержащую пробелов.

Формат выходных данных;

Выходной файл Natur.out должен содержать две строки. В первой строке должно
быть записано первое число найденной последовательности подряд идущих
натуральных чисел, но второй строке последнее число этой последовательности.

Пример:

Natur.in

012362372389

Natur.out

236
238
:o

Добавлено: 28 июн 2005, 08:53
LAngel
ничего сложного.
написал бы на чем писать, Delphi, Pascal... ну в общем алгоритм одинаковый, только чтение/запись из файла будет по другому.

Код: Выделить всё

procedure Calculate;
var
  inS, S, outS: String;
  outL, outN: Integer;
  i, j, k, l: Integer;
  n1, n2: Integer;
  C: Integer;
  st: TStringList;
begin
  st := TStringList.Create;
  try
    st.LoadFromFile('Natur.in');
    inS:= Trim(st[0]);
    st.Clear;
    k := 1;
    outS := ''; outN := 0; outL := 0;
    while k <= Length(inS) div 2 do
    begin
      i := 1;
      while i <= Length(inS) do
      begin
        j := i+k; C := 0;
        n1 := StrToInt(Copy(inS, i, k));
        while j <= Length(inS)-k do
        begin
          n2 := StrToInt(Copy(inS, j, k));
          if n2 = n1 + 1 then
          begin
            inc(c);
            n1 := n2;
          end else break;
          inc(j, k);
        end;
        if c > 0 then
        begin
          S := '';
          For l := n1-c to n1 do S := S + IntToStr(l);
          if ((Length(S) = Length(outS)) and (n1 > outN)) or
             (Length(S) > Length(outS)) then
          begin outS := S; outL := c; outN := n1; end;
        end;
        inc(i);
      end;
    inc(k);
    end;
    st.Add(IntToStr(outN-outL));
    st.Add(IntToStr(outN));
    st.SaveToFile('Natur.out');
  finally
    st.Free;
  end;
end;

Добавлено: 28 июн 2005, 09:08
LAngel
Да, забыл проверить переход через 9..10 99..100 и т.д.
исправляемся:

Код: Выделить всё

procedure Calculate;
var
  inS, S, outS: String;
  outL, outN: Integer;
  i, j, k, l: Integer;
  n1, n2: Integer;
  C: Integer;
  st: TStringList;
  back: Boolean;
begin
  st := TStringList.Create;
  try
    st.LoadFromFile('Natur.in');
    inS:= Trim(st[0]);
    st.Clear;
    k := 1;
    outS := ''; outN := 0; outL := 0;
    while k <= Length(inS) div 2 do
    begin
      i := 1;
      while i <= Length(inS) do
      begin
        j := i+k; C := 0;
        n1 := StrToInt(Copy(inS, i, k));
        back := false;
        while j <= Length(inS)-k do
        begin
          if Length(IntToStr(n1+1)) > Length(IntToStr(n1)) then
          begin
            back := True;
            inc(k);
          end;
          n2 := StrToInt(Copy(inS, j, k));
          if n2 = n1 + 1 then
          begin
            inc(c);
            n1 := n2;
          end else break;
          inc(j, k);
        end;
        if back then dec(k);
        if c > 0 then
        begin
          S := '';
          For l := n1-c to n1 do S := S + IntToStr(l);
          if ((Length(S) = Length(outS)) and (n1 > outN)) or
             (Length(S) > Length(outS)) then
          begin outS := S; outL := c; outN := n1; end;
        end;
        inc(i);
      end;
    inc(k);
    end;
    st.Add(IntToStr(outN-outL));
    st.Add(IntToStr(outN));
    st.SaveToFile('Natur.out');
  finally
    st.Free;
  end;
end;