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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2013, 21:24   #1
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию Pascal посчитать количество семерок в диапазоне ускорение алгоритма

Цитата:
Ограничение по времени: 0 .5 секунд
В строке записаны все подряд натуральные числа от некоторого N до нек-рого M
(гарантировано N ≤ M ) . Сколько в этой строке записано копий цифры 7?
16 22
Ответ: 1
43 87
Ответ: 15
Мое решение слишком медленное для ограничения для n в миллиард
Код:
var
  m, n, i, j, index: longint;
  temp: string;
 
begin
  assign(input, 'dig7.dat');
  Reset(input);
  assign(output, 'dig7.sol');
  rewrite(output);
  Read(m, n);
  for j := m to n do
  begin
    str(j, temp);
    for i := 1 to length(temp) do
      if temp[i] = '7' then inc(index);
  end;
  Write(index);
  close(input);
  close(output);
end.
Надо бы ускорить.

Добавлено через 15 минут
Делал что-то вроде
Код:
while temp<>0 do
if temp mod 10 = 7 then  inc(index);
temp:=temp div 10
То же самое - времени нет.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 15.01.2013, 21:44   #2
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

Код:
for i := 1 to length(temp) do
      if temp[i] = '7' then inc(index);
вы считаете длину каждую итерацию цикла, здесь прога и проседает, сделайте так
leng = length(temp)
for i:= 1 to i do ...
denrubun вне форума Ответить с цитированием
Старый 15.01.2013, 21:53   #3
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Спасибо, но не помогло - в полсекунды не влазит все равно.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 15.01.2013, 21:54   #4
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

а насколько хоть разогналось, сколько не хватает?
denrubun вне форума Ответить с цитированием
Старый 15.01.2013, 21:57   #5
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Цитата:
Сообщение от denrubun Посмотреть сообщение
а насколько хоть разогналось, сколько не хватает?
Чесно - без понятия. На сервере проверяет. Но маленькие проходило и проходит за 0.004 с. Ограничение в миллиард как бы намекает...
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 15.01.2013, 22:01   #6
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

а ой я совсем не правильно понял вашу задачу)
теперь понял и дела обстоят так:
вы знаете что например от 1 до 100 семь встречается 1 раз на каждую десятку +
ровно 10 раз если эта десятка 70 - 79; ну дальше вы наверно справитесь, ищите закономерность появления семерок
главное не надо читать все числа и сравнивать их) только первое и последнее

п.с. олимпиадная задачка чтоль?
denrubun вне форума Ответить с цитированием
Старый 15.01.2013, 22:03   #7
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Хм, я, собственно, так и думал. Только решил проверить, что народ скажет. Будем реализовывать. Спасибо.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 15.01.2013, 22:52   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Подсказка: пусть у нас задан интервал 974615 - 3573914. Его можно разбить:
974615-974619 (5+1),
974620-974699 (80+10+8),
974700-974999 (300+100+30+30),
975000-979999 (5000+1000+500+500),
980000-999999 (2000+2000+2000+2000),
1000000-2999999 (200000+200000+200000+200000+200000 +200000),
3000000-3499999 (50000+50000+50000+50000+50000),
3500000-3569999 (7000+7000+7000+7000),
3570000-3572999 (3000+300+300+300),
3573000-3573899 (900+100+90+90),
3573900-3573909 (10+1),
3573910-3573914 (5)
Всего (если нигде не напутал) - 1499660 семёрок, считается почти устно. Осталось научить этому фокусу компьютер...
Abstraction вне форума Ответить с цитированием
Старый 15.01.2013, 23:00   #9
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Спасибо, попробуем.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 16.01.2013, 17:07   #10
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Ужас, не получается - и все.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести количество семерок в числе (Delphi) qpuTuJlb Помощь студентам 8 23.11.2012 22:00
Посчитать сумму всех целых чисел в этом диапазоне LION7777 Фриланс 14 15.06.2010 00:16
в массиве найти количество злементов лежащих в диапазоне от A до B Deniska112 Общие вопросы C/C++ 14 02.06.2009 17:59
вычислить количество элементов массива, лежащих в диапазоне от А до В Gigatrest Паскаль, Turbo Pascal, PascalABC.NET 16 26.01.2009 14:05