![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Witaliy |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Мужской Реальное имя: Witaliy Репутация: ![]() ![]() ![]() |
Всем привет!
У меня есть задача: Нужно подсчитать сумму всех счестливых числел в промежутке [a;b]. Счастливые числа - числа которые состоят только из 4 и 7 например Входные данные: 5 49 Выходные данные: 98 (7+44+47=98) 1 <= A <= B <= 1000000000 (10^9) Вот моё решение: {$n+} Но программа очень медленно роботает, а ограничение велики. Помогите сделать что-то, что бы можно были делать и под 1 и 10^9. Спасибо! Сообщение отредактировано: Lapp - 23.02.2009 3:36 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Во-первых, избавляешься от преобразования числа в строку. Это ОЧЕНЬ медленно...
function isLucky(c: longint) : boolean; так будет в среднем (по замерам времени выполнения) в 15 раз быстрее на больших значениях b... Но это еще не все... For выполняется медленнее, чем While, опять же по замерам выигрыш - около 3-5% времени, это тоже нельзя сбрасывать со счетов... Но и это еще не все.... Вместо того, чтобы постоянно крутить цикл с шагом 1, и проверять число, которое ЗАВЕДОМО не может быть счастливым, будем пропускать некоторые числа, и проверять только те, последняя цифра которых - 4 или 7. Вот так это делается: var a,b,i : longint;Разберешься, почему именно так, или объяснить? Результаты работы твоей и моей программы совпадают... Update НО... И это еще не предел... Как ни странно, тут рекурсия дает тысячекратные выигрыши во времени. Смотри, вместо того, чтобы крутить циклы из миллионов (и больше) итераций, просто напросто генерируешь все счастливые числа. А их - всего чуть больше 1000. И к тому же не надо проверять их. Они изначально счастливые: program my; - выполняется мгновенно, против 11 секунд для вышеприведенного варианта на максимальных входных данных (от 1 до 1 млрд)... Результаты, опять же, совпадают... |
Lapp |
![]()
Сообщение
#3
|
|||
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
|||
Witaliy |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Мужской Реальное имя: Witaliy Репутация: ![]() ![]() ![]() |
ОЧЕНЬ большое спасибо всем! Даже не думал что так просто можно это сделать)
|
Witaliy |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Мужской Реальное имя: Witaliy Репутация: ![]() ![]() ![]() |
У меня еще есть такая задача:
Счастливые числа єто те числа, которые делятся одновременно и на x и на y и на z Найти все такие числа в промежутке [a;b]. Например 2 3 4 12 24 Результат: 2 (это числа 12, 24). Вот мой код: program my; Сново не знаю как оптимизировать. Возможно тоже надо делать while? Спасибо огромное. |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Я, конечно, могу ошибаться, но мне почему-то кажется, что можно вообще выбросить цикл за ненадобностью:
writeln(((b - a) div LCМ(x, y, z)) + 1);выдаст тебе нужный результат... LCM - это Least Common Multiple - наименьшее общее кратное чисел (НОК)... Как находится НОК было на форуме неоднократно, ищи... |
Witaliy |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Мужской Реальное имя: Witaliy Репутация: ![]() ![]() ![]() |
Извините, искал, но не нашло... если можете, дайте ссилку... спасибо.
Сообщение отредактировано: Witaliy - 22.02.2009 17:56 |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
|
Witaliy |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Мужской Реальное имя: Witaliy Репутация: ![]() ![]() ![]() |
Такой вариант не пройдёт, неверные ответы. Нужно как-то оптимизировать мой код.
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата неверные ответы Ну, значит и в твоем решении ответы - неверные... Так? И вообще, я не знаю, что ты там намудрил, и как что вызывал... Поэтому входные данные, для которых ответы по-твоему неверные, в студию... И, заодно, какие при этих данных по-твоему должны быть верные ответы - тоже... |
Witaliy |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Мужской Реальное имя: Witaliy Репутация: ![]() ![]() ![]() |
Я здаю задачу на контестер, и не знаю какие входные данные там должны быть
|
volvo |
![]()
Сообщение
#12
|
Гость ![]() |
Ну, в таком случае тебе ее и решать, для контестера... А то очень мудрые все стали: "Кто-то решает, а кто-то сдает"...
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 14:11 |