![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
altairaimenov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 3.3.2015 Репутация: нет Всего: нет |
Найти количество цифр n!(n 10^9)
Пример: 10 Вывод: 7 Поясняю 10! = 3628800, тут 7 цифр Это сообщение отредактировал(а) altairaimenov - 3.3.2015, 18:28 |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
В целом числе ровно floor(log(x)) + 1 цифр. (log10 разумеется имеется ввиду)
Можно решить апромиксацией стирлинга: http://en.wikipedia.org/wiki/Stirling%27s_approximation То есть: Найти a = sqrt(2*PI * n) * (n/e)^n Потом b = a * (1 + 1/(12*n - 1)) где PI - это число пи, а e - число ейлера Найти кол-во цифр в a и b. Если одинаковое то ответ есть, если не одинаковое, что будет редко, то наверное можно как-то подругому проверить. Пока других идей в голову не лезет Пример: n = 10 a = 3598695.[...] b = 3628936.[...] кол-во цифр в а = 7 кол-во цифр в b = 7 ответ 7 Это сообщение отредактировал(а) sQu1rr - 3.3.2015, 19:05 |
|||
|
||||
kemiisto |
|
||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Во-первых, это однозначно в "Центр помощи".
Во-вторых, язык то какой: С или С++? Общая идея такова.
Добавлено @ 18:59
Да не, не надо тут никаких аппроксимаций. Танцуем от того, что логарифм произведения равен сумме логарифмов. ![]() Это сообщение отредактировал(а) kemiisto - 3.3.2015, 19:07 -------------------- |
||||
|
|||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
||||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
sQu1rr, тоже верно. Таки floor(log10(m)) + 1 всегда будет работать.
Добавлено через 4 минуты и 54 секунды В смысле, долго? А кому сейчас легко? ![]() Добавлено через 5 минут и 58 секунд
Меньше минуты на моём старье. Меня устраивает. ![]() Это сообщение отредактировал(а) kemiisto - 3.3.2015, 19:06 -------------------- |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
||||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Не совсем понял, о чём ты. Точнее, совсем не понял. -------------------- |
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
Примерно так: "Даже такой медленный интерпретируемый язык как питон, решает эту задачу моим способом меньше чем за секунду (точнее моментально), а не за минуту на С. Зачем мучать свое железо вычеслениями, когда можно сделать проще - и самому не ждать и железо не утруждать."
|
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Ну, release-версия, собранная с -O3, считает за 15 секунд. ![]() ![]() Это сообщение отредактировал(а) kemiisto - 4.3.2015, 00:17 -------------------- |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
а нужен ли точный ответ? для 1е9 число цифр по первому приближению стирлинга совпадает с вашей суммой.
погрешность определения числа цифр гораздо меньше, чем погрешность самого факториала. кстати, с чего вы взяли, что ваш результат точен: и логарифм, и суммирование это заведомо неточные операции. Добавлено через 59 секунд http://ideone.com/KCrQmy |
|||
|
||||
kemiisto |
|
|||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Откуда мне знать. ТС так и не объявлялся. Однако обычно, если не указано иное, нужен именно точный ответ. Зачем считать заведомо приближённо, если можно посчитать точно? Дался вам этот Стирлинг. ![]()
Да ну прямо счаз. Там double всё-таки. Гарантированно 15–17 значащих цифр. Аргументы логарифма до 10^9, сами значения от 0 до 9. Каким образом Вы тут собрались накопить ошибку при 15–17 значащих цифрах? Арифметика с плавающей точкой, конечно, неточная, но она ж не всегда настолько неточная, чтоб за компьютер вообще не садиться. ![]() -------------------- |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
на 1e9 сложениях при 15 значащих цифрах может накопиться погрешность порядка 1e-6. пустячок, но приятно))
|
|||
|
||||
sQu1rr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
взаимоисключающие параграфы однако ![]()
Ну так мой аргумент же скорость. Я полностью согласен что можно считать и не приближением, и будет меньше погрешность скорее всего, но зачем? Точный ответ в кол-ве цифр, а не факториала. Приблежение стирлинга с этим вполне хорошо справляется. Да и вообще спор бесмыслен. вы предложили один способ, я второй. В отличие от вас, я не говорю про ваш способ "не нужен". Для ОП это будет возможность попробовать оба, и еще и математики подучить. |
|||
|
||||
kemiisto |
|
||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 5 Всего: 160 |
Почему? ![]()
Бывает, что нужно быть абсолютно уверенным в ответе, и ради этого можно и подождать.
Вы можете гарантировать (доказать), что для всех чисел до 10^9 использование формулы Стирлинга даст верное число цифр? Это сообщение отредактировал(а) kemiisto - 4.3.2015, 15:13 -------------------- |
||||
|
|||||
sQu1rr |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 597 Регистрация: 11.11.2008 Где: london Репутация: 3 Всего: 13 |
У меня нет компилятора под рукой - проверьте пожалуйста. А вы можете за разумное время гарантировать то же самое про свой метод? Не считая матиматически доказуемой незначительной погрешности, которая все таки может сыграть свою роль, хоть это и настолько маловероятно, что даже проверять не стоит. Ну релиз в -O3 не компилируется. -O3 сам по себе подрузамевает тестинг.
Согласен. Если это нужно - ваш способ - верный путь. |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |