Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Решал сегодня одну задачу (и кстати воспользовался типом данных из языка С++ что мне давеча посоветовали). На 8 тесте валится. Вероятно проблема с алгоритмом. Подскажите пожалуйста как бы её решали на языке С++ или С. Текущее решение (проблема с 8 тестом) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. PS Данная тема скорее относится к разделу Программирование, но в связи очередной недавней дискриминацией самого себя (подраздела Программирования) , больше не хочу задавать вопросов в том разделе. С другой стороны, я не сторонник строгой дифференциации, тем более, инструментом решения данной конкретной задачи является семейство языков С/С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 09:26 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
С проверками разберись. Сначала на ноль делишь, а потом проверяешь что s==0 Про div() тут как-раз прекрасный пример что не надо читаемостью жертвовать. Написал бы вместо него Код: plaintext 1. не накосячил бы с делением на ноль. Это бесконечный цикл Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 09:59 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Раз уж ты за супер-мега оптимизаторство борешься, то Код: plaintext 1. и Код: plaintext 1. это разные операции для процессора. Есть отдельная команда процессора ( INC ) для увеличения на 1, она быстрее чем сложение ( ADD ), и сложение требует отдельного хранения второго слагаемого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:11 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
По первому замечанию согласен, рефакторинг Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Бесконечного цикла, как мне кажется, быть не должно.. Может что-то не учёл, но такой контрпример не могу подобрать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:18 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima TЕсть отдельная команда процессора ( INC ) для увеличения на 1, она быстрее чем сложение ( ADD ), и сложение требует отдельного хранения второго слагаемого. Я думаю, что и в этом случае компилятор умнее программиста и выберет то что быстрее )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:18 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Дмитрий, просто Код: plaintext 1. смотрится красивее чем унарный инкремент :) Но я исправил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:20 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercury, За goto внутрь if надо отрывать руки. Не говоря уже о том, что goto тут нафиг не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:21 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercury, За goto внутрь if надо отрывать руки. Не говоря уже о том, что goto тут нафиг не нужен. Дело в том, что вы конечно в чём то правы, но мне захотелось посмотреть как будет выглядеть код с goto :) Например, недавно я увидел код Дмитрия следующего вида Код: plaintext 1. 2. 3. И хотя ранее, я никогда не использовал такую стилистику в своём коде, мне понравилось, потому что я увидел как это выглядит. А теперь использую. Вот и сейчас захотел посмотреть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:26 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЯ думаю, что и в этом случае компилятор умнее программиста и выберет то что быстрее )) Чего тут думать, проверить просто: Код: plaintext 1. 2. 3. 4. 5. MS VC 2008 Express. Сборка Release c дефолтными настройками оптимизации Не особо умный :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:27 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima T, В Express ограничен уровень оптимизаций, так что этот пример ни о чем не говорит. А например gcc генерит одинаковый код для +=1 и ++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:36 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercury Код: plaintext 1. 2. 3. 4. 5. вместо goto exit рука не поднялась написать return -1? Забудь про goto, особенно в таком извращенном применении. SashaMercuryБесконечного цикла, как мне кажется, быть не должно.. А если подумать головой? Не буду подсказывать, сам догадайся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:36 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryмне понравилось, потому что я увидел как это выглядит. А теперь использую. Ну кому-то и бухать и колоться нравится. Но это не повод )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:39 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Глупый вопрос - чему будет равно t на выходе из Код: plaintext 1. если d.quot перед входом в цикл =0? И с какой стати этому циклу вообще завершаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:42 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercury, goto можно применять только если в функции есть нетривиальный завершающий код, который надо вызывать из разных веток кода. Все остальные варианты goto - бессмысленны и вредны. Схема использования такая: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:44 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyDima T, В Express ограничен уровень оптимизаций, так что этот пример ни о чем не говорит. А например gcc генерит одинаковый код для +=1 и ++. Говорит что все компиляторы разные. Полной версии MS VC нет чтобы сравнить. Хотя тот же экспрес оптимизирует такую конструкцию Код: plaintext 1. 2. 3. 4. 5. 6. И вообще не оптимизирует div() Код: plaintext 1. 2. 3. 4. Саш, div() это тормоз, по крайней мере в MSVC Express ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 10:49 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНапример, недавно я увидел код Дмитрия следующего вида Код: plaintext 1. 2. 3. И хотя ранее, я никогда не использовал такую стилистику в своём коде, мне понравилось, потому что я увидел как это выглядит. А теперь использую. Вот и сейчас захотел посмотреть :) Это основы. Причем любого языка, а не только С. Три вида циклов: for(), while() и do ... while() Если плохо понимаешь как они работают - потрать время на изучение. while() работает так Код: plaintext 1. 2. 3. 4. 5. 6. SashaMercuryБесконечного цикла, как мне кажется, быть не должно.. Может что-то не учёл, но такой контрпример не могу подобрать Весь код не посмотрел сразу, в твоем случае не зациклится потому что цикл никогда не выполнится, т.к. все варианты где d.quot == 0 у тебя отсекают предварительные проверки. Т.е. ты написал ненужный кусок кода. Тоже косяк, т.к. зачем-то ты его писал. PS В суть алгоритма не вдумывался, просто указал на очевидные ошибки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 11:59 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЗа goto внутрь if надо отрывать руки.каждый начинающий программист должен понаступать на все старые грабли, они ведь так удобно лежат ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 12:04 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima TЭто бесконечный цикл Код: plaintext 1. 2. 3. 4. с чего бы? d.quot целое ведь. а вот эта конструкция бессмыссленна: Код: plaintext 1. ведь только что мы добились того, чтобы d.quot стало равным 0, оно никогда не сможет стать равным 1 ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 12:11 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
egorychс чего бы? d.quot целое ведь. 0 / 2 сколько будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 12:29 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryкак бы её решали на языке С++ или С. Я бы сначала проверил и отсёк краевые условия: Код: sql 1. 2. 3. 4. Потом я бы воспользовался следующим алгоритмом: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Тебе, как математику, должно быть очевидно как он работает. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 12:31 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima Tegorychс чего бы? d.quot целое ведь. 0 / 2 сколько будет?нормально я затупил, качественно прошу прощения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 12:42 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
А по здравому размышлению алгоритм сводится к следующему? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 13:48 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Ммм.... primes... вкуснятина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 16:50 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonprimes... вкуснятина. А без них в одну секунду не уложиться на верхнем конце диапазона. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 17:32 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Почитал условия. В принципе задача сводится к разложению частного двух чисел на простые множители, а затем эти множители надо сложить. Мой вариант Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 17:49 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima TМой вариант А, чёрт, точно, я не учёл, что один множитель может повторяться. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 18:00 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovDima TМой вариант А, чёрт, точно, я не учёл, что один множитель может повторяться. еще не учел что всего один множитель может быть (sqrt(a) не в тему) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 18:45 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Можно наверное из цикла выскочить раньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 18:48 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovя не учёл, что один множитель может повторяться. Хотя я тоже лишнее написал: Код: plaintext 1. достаточно что i++ не выполняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 18:49 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonМожно наверное из цикла выскочить раньше. Вроде нет. Крайние варианты (1,7) = 7 и (1,8) = 6 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2015, 18:54 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercuryНапример, недавно я увидел код Дмитрия следующего вида Код: plaintext 1. 2. 3. И хотя ранее, я никогда не использовал такую стилистику в своём коде, мне понравилось, потому что я увидел как это выглядит. А теперь использую. Вот и сейчас захотел посмотреть :) Это основы. Причем любого языка, а не только С. Три вида циклов: for(), while() и do ... while() Если плохо понимаешь как они работают - потрать время на изучение. Дима, да при чём тут основы с циклами, стилистика со скобками понравилась, я ведь написал Ранее, меня беспокоил такой код Код: plaintext 1. 2. 3. 4. но я увидел у тебя Код: plaintext 1. 2. 3. и мне понравилось И да, я знаю что можно так Код: plaintext 1. 2. 3. но мне не нравится :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 01:41 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima T SSБесконечного цикла, как мне кажется, быть не должно.. А если подумать головой? Не буду подсказывать, сам догадайся. не должно быть бесконечного цикла никогда. Он может быть только если на входе 0, этот вариант отсекается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 01:46 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Простых чисел порядка 80000, не очень удобно будет хранить их таким образом (в коде программы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 02:08 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПростых чисел порядка 80000, не очень удобно будет хранить их таким образом (в коде программы) можно генерировать, это не проблема конечно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 02:09 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДима, да при чём тут основы с циклами, стилистика со скобками понравилась, я ведь написал Так и упоминул бы сразу про скобки, я про эту мелочь и не подумал, нафантазировал непонятно чего :) Так код компактнее, меньше строк со скобками. Вопрос из серии "На вкус и цвет ...". SashaMercuryИ да, я знаю что можно так Код: plaintext 1. 2. 3. но мне не нравится :) И правильно, не надо так писать, накосячить легко, добавишь так строчку Код: plaintext 1. 2. 3. 4. и визуально кажется что в цикл добавил, а реально за него. Поэтому без скобок только так Код: plaintext 1. правда так дебагером отлаживать неудобно. SashaMercuryне должно быть бесконечного цикла никогда. Он может быть только если на входе 0, этот вариант отсекается Так и не понял чтоли? Если на входе 0, то твой цикл начнет выполнятся и зациклится, если не 0, то цикл не будет выполнятся. Т.к. у тебя на входе 0 быть не может (из-за предварительных проверок), то код в цикле никогда не выполнится. Зачем он тогда написан? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 07:17 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercurySashaMercuryПростых чисел порядка 80000, не очень удобно будет хранить их таким образом (в коде программы) можно генерировать, это не проблема конечно Можно, только зачем? Если известно что они нужны, в итоге те же 80000 будут вычислены, просто при каждом запуске проги будет теряться время на этот бесполезный расчет. Можешь скомбинировать для универсальности: первые брать из массива, как потребуется больше - считать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 07:32 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima TТ.к. у тебя на входе 0 быть не может (из-за предварительных проверок), то код в цикле никогда не выполнится. Зачем он тогда написан? Почему код в цикле никогда не выполнится ? Например 8/1=8. Цикл выполнится трижды 8->4, 4->2, 2->1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:26 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Я кажется не то написал.. Там должно быть .rem, как у меня тогда до 8 теста программа дошла. Прошу прощение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:32 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
А я думаю, что такое, что там не понятного в том цикле :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:33 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЯ кажется не то написал.. Я на это и намекал :) SashaMercuryкак у меня тогда до 8 теста программа дошла. Отлаживать надо лучше. Придумывай нехорошие варианты. Смотри как отработает. Вот мой набор: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:40 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. Мой алгоритм не оптимальный 1 0 0 0 2 2 2 0 3 3 3 0 4 4 4 0 5 5 5 0 6 5 5 0 7 7 7 0 8 6 6 0 9 6 9 -3 10 7 7 0 11 11 11 0 12 7 7 0 13 13 13 0 14 9 9 0 15 8 15 -7 16 8 8 0 17 17 17 0 18 8 11 -3 19 19 19 0 20 9 9 0 21 10 21 -11 22 13 13 0 23 23 23 0 24 9 9 0 25 10 25 -15 26 15 15 0 27 9 27 -18 28 11 11 0 29 29 29 0 30 10 17 -7 31 31 31 0 32 10 10 0 33 14 33 -19 34 19 19 0 35 12 35 -23 36 10 13 -3 37 37 37 0 38 21 21 0 39 16 39 -23 40 11 11 0 41 41 41 0 42 12 23 -11 43 43 43 0 44 15 15 0 45 11 45 -34 46 25 25 0 47 47 47 0 48 11 11 0 49 14 49 -35 50 12 27 -15 51 20 51 -31 52 17 17 0 53 53 53 0 54 11 29 -18 55 16 55 -39 56 13 13 0 57 22 57 -35 58 31 31 0 59 59 59 0 60 12 19 -7 61 61 61 0 62 33 33 0 63 13 63 -50 64 12 12 0 65 18 65 -47 66 16 35 -19 67 67 67 0 68 21 21 0 69 26 69 -43 70 14 37 -23 71 71 71 0 72 12 15 -3 73 73 73 0 74 39 39 0 75 13 75 -62 76 23 23 0 77 18 77 -59 78 18 41 -23 79 79 79 0 80 13 13 0 81 12 81 -69 82 43 43 0 83 83 83 0 84 14 25 -11 85 22 85 -63 86 45 45 0 87 32 87 -55 88 17 17 0 89 89 89 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:58 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryМой алгоритм не оптимальный Ожидаемо, ты же только два простых числа взял (1 и 2), совпали только варианты где частное раскладывается на X или X*2^N, где X простое. 3*3 уже не обработалось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 09:08 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonМожно наверное из цикла выскочить раньше. Точно, можно, достаточно таблицы до sqrt(10^9) если не путаю Саша допиливай идею :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 09:21 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonМожно наверное из цикла выскочить раньше. Точно, можно, достаточно таблицы до sqrt(10^9) если не путаю Саша допиливай идею :) У меня осталось полчаса сегодня. Вечером компьютера не будет( Сейчас попробую ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 09:57 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Дополнил, а проверить не могу, сервер не работает у них, вероятно Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:13 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
На 7 тесте time limit, хм. Уже нет времени отлаживать, завтра доделаю, мне пора выключать компьютер ( Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:27 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryДополнил Коряво дополнил, посчитай (1, 982451653) и подумай как еще ускорить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:32 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
почитай про алгоритмы проверки на простое http://habrahabr.ru/post/122538/ http://habrahabr.ru/post/133037/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:38 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
допилил код Dima T с таблицей целых чисел тест проходит Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:46 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryНа 7 тесте time limit, хм. Я же говорил, что без таблицы в одн секунду не уложиться. Не хочется хранить её прямо в коде - ситай из внешнего файла если это позволено. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 12:38 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Это неоптимально. При проверке на Prime можно сразу скипать чётные числа. Шаг делать равным 2. А двойку проверить отдельно вне цикла. Код: plaintext 1. Это нужно выкинуть нафиг. Код: plaintext 1. Есть инкрементальный целочисленный расчёт квадратного корня. Есть просто целочисленный квадратный корень. Ищите в форуме мои посты 2-х годичной давности. Там генератор простых чисел обсуждался. + Если уже имеется вектор расчитанных простых то их можно использовать в качестве делителей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 12:43 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Без таблицы никак, иначе считать каждый раз. Тут хорошо расписана оптимизация генераторов. http://habrahabr.ru/post/122538/ Переписал оттуда генератор на С Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. До миллиона за десятки мс генерит, если больше надо - тут алгоритмы посерьезнее http://habrahabr.ru/post/133037/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 13:16 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Вы меня испугали. Я уже подумал что нужно больше отдыхать, если я так сильно ошибался когда пытался решить данную задачу без дополнительных затрат статической памяти. Но это оказалось не так. Вообще говоря, Кнут(если не ошибаюсь) пишет примерно следующее: если число вариантов перебора менее 10! то можно использовать перебор. В данном конкретном случае, мы имели дело с простыми числами в диапазоне . Согласитесь, это немного. Потеря производительности была на другом участке кода, ниже рефакторинг с оптимизациями касаемо поиска простых чисел (они не играют решающую роль, можно оставить их как и прежде), и изменением в алгоритме Дмитрия Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 06:39 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Не удержался C: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 06:44 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Хотя если так подумать, это не изменения в алгоритме Дмитрия(ибо его алгоритм предназначен для таблицы простых числе куда может входить число а), а модификация алгоритма для решения задачи без статической таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 07:08 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
От моего алгоритма только каркас остался :) Еще была версия m_Sla 17433850 Это лишнее Код: plaintext 1. a всегда больше 0 и sqrtl((long double)x) не панацея: от того что точность повышаешь она идеальной не становится, нет гарантии что корень из 9 не получится 2.999999999999999 и приведется к 2, я бы так писал Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 07:40 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Я выше ссылки на статью про генераторы давал, не почитал? Там хорошая мысль была как корни не считать. Это Код: plaintext 1. равносильно этому Код: plaintext 1. В принципе ничего гениального, но все считают корни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 07:52 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Да, сравнивать нет смысла, строчка лишняя. Можно сравнивать произведение, знаю об этом. Ознакомился с информацией по ссылкам, спасибо :) но т.к. я этой проблемой глубоко не занимаюсь, и пока не планирую, не стал углубляться. Решето Эратосфена мне знакомо давно. Аткина, в общих чертах знал, сейчас посмотрел ещё раз ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 08:47 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima T, более того, такой for вообще ересь — условие выхода из цикла считается заново каждую итерацию, при том, что оно не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:00 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
RWolfболее того, такой for вообще ересь — условие выхода из цикла считается заново каждую итерацию, при том, что оно не меняется. В целом согласен, но в данном случае корень тоже считается каждую итерацию, но наверно компилятор это оптимизирует. В принципе цикл можно соптимизировать расчетом последовательности квадратов: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:29 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Dima T, простой тест: Код: plaintext 1. 2. 3. 4. 5. 6. 7. gcc -std=c99 -O2 -S 1.c .globl _count_op .def _count_op; .scl 2; .type 32; .endef _count_op: LFB39: .cfi_startproc pushl %esi .cfi_def_cfa_offset 8 .cfi_offset 6, -8 pushl %ebx .cfi_def_cfa_offset 12 .cfi_offset 3, -12 subl $36, %esp .cfi_def_cfa_offset 48 xorl %ebx, %ebx movl $1, %esi fildl 48(%esp) fstpl 16(%esp) jmp L4 .p2align 2,,3 L5: sall %esi incl %ebx L4: fldl 16(%esp) fstpl (%esp) call _sqrt movl %ebx, 28(%esp) fildl 28(%esp) fxch %st(1) fucompp fnstsw %ax testb $69, %ah je L5 movl %esi, %eax addl $36, %esp .cfi_def_cfa_offset 12 popl %ebx .cfi_restore 3 .cfi_def_cfa_offset 8 popl %esi .cfi_restore 6 .cfi_def_cfa_offset 4 ret .cfi_endproc call _sqrt в каждой итерации, хотя, казалось бы, оптимизация включена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:40 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Понравилась идея SashaMercury с get_next_prime(), переделал немного свой генератор 17434730 Расчет следующего простого с кэшем Заменил глобальный массив на static и добавил дописывание кэша по необходимости Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. До миллиона быстро генерит. Может кому пригодится. Я уже не раз качал таблицы, шаманил с форматированием чтоб в код вставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:54 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Только производная от квадратного корня имеет другой вид. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 11:03 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
RWolfDima T, простой тест: Код: plaintext 1. 2. 3. 4. 5. 6. 7. gcc -std=c99 -O2 -S 1.c .globl _count_op .def _count_op; .scl 2; .type 32; .endef _count_op: LFB39: .cfi_startproc pushl %esi .cfi_def_cfa_offset 8 .cfi_offset 6, -8 pushl %ebx .cfi_def_cfa_offset 12 .cfi_offset 3, -12 subl $36, %esp .cfi_def_cfa_offset 48 xorl %ebx, %ebx movl $1, %esi fildl 48(%esp) fstpl 16(%esp) jmp L4 .p2align 2,,3 L5: sall %esi incl %ebx L4: fldl 16(%esp) fstpl (%esp) call _sqrt movl %ebx, 28(%esp) fildl 28(%esp) fxch %st(1) fucompp fnstsw %ax testb $69, %ah je L5 movl %esi, %eax addl $36, %esp .cfi_def_cfa_offset 12 popl %ebx .cfi_restore 3 .cfi_def_cfa_offset 8 popl %esi .cfi_restore 6 .cfi_def_cfa_offset 4 ret .cfi_endproc call _sqrt в каждой итерации, хотя, казалось бы, оптимизация включена. странно, z в теле цикла не меняется в данном конкретном случае. По хорошему должен оптимизировать. Может быть есть квалификатор обратный к volitile ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:03 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonТолько производная от квадратного корня имеет другой вид. Марк, можно подробнее причём тут производная, для особо одарённых :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:07 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
А откуда оптимизатору знать что sqrt - это чистая функция, которая зависит только от аргументов? А без этого знания ни о каком предварительном вычислении не может быть и речи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:07 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Просто компилятор не знает, что sqrt() не имеет побочных эффектов, и поэтому не может выкинуть лишние вызовы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:08 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА откуда оптимизатору знать что sqrt - это чистая функция, которая зависит только от аргументов? А без этого знания ни о каком предварительном вычислении не может быть и речи. а нет оптимизаций во время выполнения программы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:09 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
SashaMercuryа нет оптимизаций во время выполнения программы ? Нет. А как бы это помогло? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:16 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Можно оптимизатору помочь иногда Код: plaintext 1. 2. или так (если направление не важно) Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:19 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskySashaMercuryа нет оптимизаций во время выполнения программы ? Нет. А как бы это помогло? :) Видимо никак. Если бы компилятор знал о том что у этой функции нет побочных эффектов, и аргументы не меняются в теле цикла, он мог бы оптимизировать. Впрочем, Дмитрий предложил хороший вариант, который будет применим и для других аналогичных ситуаций ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 14:26 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Думайте шЫрше. Мы можем (грубо) заменить параболу на последовательность кусочно-линейных функций. И это будет выигрыш. Главное чтоб эти кусочки были больше либо равны параболе. Весь вопрос в выборе шага. Побочный эффект - парочка "лишних" делений. Которые на результат не влияют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 15:41 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
maytonМы можем (грубо) заменить параболу на последовательность кусочно-линейных функций. И это будет выигрыш. Главное чтоб эти кусочки были больше либо равны параболе. В данном случае можно вообще таблицей в пару тысяч значений. Вопрос будет ли оно быстрее умножения? На своем генераторе затестил 17438916 заменил умножение в цикле Код: plaintext 1. 2. на корень перед циклом Код: plaintext 1. 2. 3. Умножение в цикле быстрее. next_prime(10 000 000) с умножением 741 мс с корнем 851 мс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 15:59 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
посчитал в разах: корней 5`000`008 умножений 277`474`804 Т.е. если на расчет потребуется меньше 55 умножений, то выгодно. Теоретически должно взлететь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 16:07 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Прямые рисовать не стал, пошел другим путем, т.к. i у меня возрастает: Код: plaintext 1. 2. 3. 4. 5. Т.е. умножений стало на 270 млн. меньше. ИМХУ самый оптимальный вариант. Ничего не изменилось, т.е. 270 млн. умножений занимают меньше 10 мс (дискретность таймера). Интересный прикол, переключился в debug, такой код работает 1610 мс Код: plaintext 1. 2. 3. 4. 5. а если while() разремить то 1550 мс, т.е. лишние циклы ускоряют программу ХЗ кто помог, компилятор по другому регистры использовал или внутри проца какая-то оптимизация случилась. Затестил раз на десять. Стабильно проявляется в дебаге. Хорошо хоть в релизе нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 17:47 |
|
||
|
Решение одной задачи
|
|||
|---|---|---|---|
|
#18+
Потестил в линуксах. Разницы никакой от сокращения количества умножений. Побочный эффект: получился неплохой тест проца :) В виндовсе i7 750 мс. Линукс i3 1950 мс Еще три виртуалки на разных хостингах 1100, 2275 и 5650 мс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 20:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019045]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
1ms |
| others: | 264ms |
| total: | 436ms |

| 0 / 0 |
