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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2015, 19:31   #1
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию Номер страницы(TurboPascal, FreePascal)

Всем привет!

Я решил задачу, но на тестировании не прошло 7 тест (тесты нельзя проверять). Пожалуйста помогите решить задачу. Вот код и условие:


Задача C. Номер страницы

Имя входного файла: number.in
Имя выходного файла: number.out
Ограничение по времени: 2 секунды
Ограничение по памяти: 256 мегабайт

Однажды робот-библиотекарь решил устроить ревизию. На одной из полок, среди экземпляров
тридцать третьего издания Кормена, он нашел листок из условий одного древнего контеста. Роботу
известен формат оформления условий, однако этот листок привел его в замешательство.
Обычно внизу каждой страницы условий есть надпись вида «Страница i из n», где i — номер
страницы условий, а n — количество страниц в условиях. Однако на этом листе была всего одна
длинная последовательность цифр. Видимо, принтер почему-то не напечатал ни одного символа
кроме цифр. Таким образом, номера i и n слились в единую последовательность цифр.
Теперь понять, какой же был номер у найденной страницы, стало большой проблемой, и решений
у этой задачи может быть много. Роботу стало интересно, сколько существует решений, но так
как робот не предназначен для решения таких задач, он нуждается в вашей помощи. Страницы в
условиях нумеруются от 1 до n, числа i и n записываются без ведущих нулей.
Выясните, сколько есть корректных надписей вида «Страница i из n», при удалении из которых
всех символов кроме цифр получается заданная во входном файле строка.

Формат входного файла
Входной файл содержит строку, состоящую только из цифр. Длина строки лежит в пределах от
1 до 200 000, включительно.


Формат выходного файла
Выведите количество корректных надписей вида «Страница i из n», при удалении из которых
всех символов кроме цифр получается заданная во входном файле строка.


Примеры
number.in
23507645

number.out
3

В приведенном примере можно проинтерпретировать строку тремя способами:
• «Страница 2 из 3507645»
• «Страница 23 из 507645»
• «Страница 2350 из 7645»


Вот мой код:

Код:
var
 s: ansistring;
 st,sc,i,k,l,j: longint;
begin
 assign(input,'number.in');
 reset(input);
 assign(output,'number.out');
 rewrite(output);

 readln(s);
 st:=st+ord(s[1])-48;
 for i:=1 to length(s) do
 begin
  if s[i+1] = '0' then
  begin
   st:=st*10;
   continue;
  end;

  for j:=i+1 to length(s) do sc:=sc*10+ord(s[j])-48;

  if (st < sc) or (st = sc) then inc(k);
  if st > sc then
  begin
   writeln(k);
   halt;
  end;
  sc:=0;
  st:=st*10+ord(s[i+1])-48;
 end;

 writeln(k);
end.
Всем заранее спасибо!

Задачу решил! Огромное спасибо BDA и Аватар-у за помощь! Вот код:

Код:
var
 s: ansistring;
 i,k: longint;
begin
 assign(input,'number.in');
 reset(input);
 assign(output,'number.out');
 rewrite(output);

 readln(s);
 if s[1] = '0' then
 begin
  writeln(k);
  halt;
 end;
 for i:=1 to length(s) div 2 do
 begin
  if (s[i+1]<>'0') and ((2*i<Length(s)) or (Copy(s,1,i)<=Copy(s,i+1,i))) then Inc(k);
 end;
 writeln(k);
end.

Последний раз редактировалось VladKB1; 08.03.2015 в 18:57.
VladKB1 вне форума Ответить с цитированием
Старый 08.03.2015, 02:00   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

Цитата:
Длина строки лежит в пределах от 1 до 200 000
200000-значное число не влезет в longint
По-моему, нужно делать так:
Проводить границу после i-го символа.
Если i+1 символ "0", то переходить к следующему витку цикла.
Если i меньше, чем n-i, то увеличивать счетчик.
Если i равно n-i, то сравнить сами строки слева и справа от границы.

Цикл нужно делать от 1 до n div 2, где n - длина введенной строки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.03.2015, 11:49   #3
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
200000-значное число не влезет в longint
По-моему, нужно делать так:
Проводить границу после i-го символа.
Если i+1 символ "0", то переходить к следующему витку цикла.
Если i меньше, чем n-i, то увеличивать счетчик.
Если i равно n-i, то сравнить сами строки слева и справа от границы.

Цикл нужно делать от 1 до n div 2, где n - длина введенной строки.
Спасибо, но хотел сказать что 200 000 как раз таки влезет в longint, так как Min значение longint = -2147483648 , а Max значение longint = 2147483647
VladKB1 вне форума Ответить с цитированием
Старый 08.03.2015, 12:02   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
200 000 как раз таки влезет в longint
А если столько раз единицу, например, умножить на 10? Что и сделает цикл
Код:
for j:=i+1 to length(s) do sc:=sc*10+ord(s[j])-48;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 08.03.2015 в 12:05.
Аватар вне форума Ответить с цитированием
Старый 08.03.2015, 12:09   #5
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А если столько раз единицу, например, умножить на 10? Что и сделает цикл
Код:
for j:=i+1 to length(s) do sc:=sc*10+ord(s[j])-48;
Упс, не подумал Ладно потом попробую исправить как мне выше написали, а щас времени нет))

Я исправил как мне сказал BDA, но я скорее всего как-то не так написал или вы не правы. У меня не прошёл 9 тест, вот код:

Код:
var
 s: string;
 st,sc,i,k,l,j: longint;
begin
 assign(input,'number.in');
 reset(input);
 assign(output,'number.out');
 rewrite(output);

 readln(s);
 st:=st+ord(s[1])-48;
 for i:=1 to length(s) div 2 do
 begin
  if s[i+1] = '0' then
  begin
   st:=st*10;
   continue;
  end;

  for j:=i+1 to length(s) do sc:=sc*10+ord(s[j])-48;

  if i < length(s)-i then inc(k);
  if i = length(s)-i then
  if st < sc then inc(k) else if st > sc then
  begin
   writeln(k);
   halt;
  end;
  sc:=0;
  st:=st*10+ord(s[i+1])-48;
 end;

 writeln(k);
end.

Последний раз редактировалось Stilet; 08.03.2015 в 17:50.
VladKB1 вне форума Ответить с цитированием
Старый 08.03.2015, 14:49   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

За исключением ввода-вывода это весь подсчет
Код:
  k:=0;
  for i:=1 to Length(s) div 2 do
    if (s[i+1]<>'0') and ((2*i<Length(s)) or (Copy(s,1,i)<=Copy(s,i+1,i))) then Inc(k);
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 08.03.2015 в 14:52.
Аватар вне форума Ответить с цитированием
Старый 08.03.2015, 15:17   #7
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
За исключением ввода-вывода это весь подсчет
Код:
  k:=0;
  for i:=1 to Length(s) div 2 do
    if (s[i+1]<>'0') and ((2*i<Length(s)) or (Copy(s,1,i)<=Copy(s,i+1,i))) then Inc(k);
Я исправил, но уже застревает на 18 тесте.

Вот код который послал:

Код:
var
 s: string;
 st,sc,i,k,l,j: longint;
begin
 assign(input,'number.in');
 reset(input);
 assign(output,'number.out');
 rewrite(output);

 readln(s);
 st:=st+ord(s[1])-48;
 for i:=1 to length(s) div 2 do
 begin
  if s[i+1] = '0' then
  begin
   st:=st*10;
   continue;
  end;

  for j:=i+1 to length(s) do sc:=sc*10+ord(s[j])-48;

  if i < length(s)-i then inc(k);
  if i = length(s)-i then
  if st < sc then inc(k) else if st > sc then
  begin
   writeln(k);
   halt;
  end;
  sc:=0;
  st:=st*10+ord(s[i+1])-48;
 end;
 k:=0;
 for i:=1 to Length(s) div 2 do
 if (s[i+1]<>'0') and ((2*i<Length(s)) or (Copy(s,1,i)<=Copy(s,i+1,i))) then Inc(k);
 writeln(k);
end.
VladKB1 вне форума Ответить с цитированием
Старый 08.03.2015, 15:23   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А зачем там все остальное? Кроме ввода-вывода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.03.2015, 17:02   #9
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем там все остальное? Кроме ввода-вывода
Я сегодня весь день туплю)) Я вроде бы сделал всё как надо, но не прошло 58 тест Вот код:

Код:
var
 s: ansistring;
 i,k: longint;
begin
 assign(input,'number.in');
 reset(input);
 assign(output,'number.out');
 rewrite(output);

 readln(s);
 for i:=1 to length(s) div 2 do
 begin
  if s[i+1] = '0' then continue;
  if (s[i+1]<>'0') and ((2*i<Length(s)) or (Copy(s,1,i)<=Copy(s,i+1,i))) then Inc(k);
 end;
 writeln(k);
end.
VladKB1 вне форума Ответить с цитированием
Старый 08.03.2015, 17:55   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,322
По умолчанию

1) Из-за условий во втором if, первый if уже не нужен
2) Пишут, что сама строка тоже может начинаться на 0, и тогда нужно вывести 0 в качестве ответа.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ребус (TurboPascal, FreePascal) VladKB1 Помощь студентам 8 08.03.2015 14:18
Узнать номер страницы в AcroPDF mishanama Общие вопросы Delphi 3 20.04.2014 17:03
Номер страницы Gefo PHP 1 04.04.2012 18:58
Номер страницы - проставить Zirat Microsoft Office Excel 9 12.11.2009 21:39
Как сделать разрыв страницы печати по условию и узнать номер страницы Leanna Microsoft Office Excel 2 21.01.2008 06:59