|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Ускорение поиска числа факториала |
|
C/C++ - Ускорение поиска числа факториала
|
Старожил Сообщения: 222 |
Профиль | Отправить PM | Цитировать Люди помогите сделать бысрый алгоритм нахождения числа из его факториала.
Я писал вот такой код но он оч медленный #include <iostream.h> #include <fstream.h> int faknom(int a) { int i=1; while(a!=i) { a=a/i; i++; }; return i; }; int main() { int Nfak; ifstream fin("input.txt"); fin>>Nfak; fin.close(); ofstream fout("output.txt"); fout<<faknom(Nfak)<<endl; fout.close(); return 0; } Как ускорить алгоритм расчета? |
|
Отправлено: 13:00, 01-06-2008 |
Новый участник Сообщения: 15
|
Профиль | Отправить PM | Цитировать Мне кажется, алгоритм расчета тут не ускорить. Если бы числа были большими, можно было бы поискать приближенную формулу для вычисления. А так-- только последовательное деление на целые числа, начиная с 1, все правильно. int 32-разрядные вроде? примерно до 2*10^9-- это факториалы чисел до 12 или 13 только.
|
------- Отправлено: 13:47, 01-06-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать Не понимаю, почему медленно он работает.
Вот пример на JavaScript'е (ну не знаю я C), который отрабатывает мгновенно (учитывайте, что int - не безразмерен):
Попробуйте изменить fak, скажем, на 39916801 и число найдено не будет. |
Отправлено: 13:50, 01-06-2008 | #3 |
Старожил Сообщения: 222
|
Профиль | Отправить PM | Цитировать Altair86 Нет я помню точно гдето видел чото тип какойто формулы или спец метода. Но не помню где.
По инету шарил но ненашол. Алгоритм быстрее этого точно есть. Coutty мне нада скорость до 1 секунды, а при некоторых значениях скорость 1,015сек. Ето в моей ситуации неприпустимо. Используются факториалы чисел до 2000, тоесть максимально 2000! |
------- Отправлено: 13:51, 01-06-2008 | #4 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать http://en.wikipedia.org/wiki/Factorial#Rate_of_growth
Там есть только приблизительные формулы, для вычисления n! по n, Если вычислять в обратную сторону по требуется на порядок больше операций, чем для честного деления. Потому что, уже указали, что в int поместится только 12!. Т.е. в для такой операции достаточно всего 12 операций делений. |
|
------- Отправлено: 14:00, 01-06-2008 | #5 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать DaRiYs,
Цитата DaRiYs:
|
|
------- Отправлено: 14:04, 01-06-2008 | #6 |
Кот Ти Сообщения: 7318
|
Профиль | Отправить PM | Цитировать DaRiYs, так вот Altair86 и говорит - в Int влезет факториал не более чем от 12 или 13.
Иногда для скорости можно пожертвовать объёмами. Используйте подстановочные таблицы с заранее сопоставленными величинами (пусть не для всех чисел, а, скажем, каждое двадцатое. Остальные просчитывать). Алгоритм: 1. Находим число (a), которое меньше полученного из файла (f) (следующее число из таблицы будет уже больше). 2. Определяем сопоставляемое этому значению число (b). 3. И число (a) умножаем на (b++), пока произведение не будет равно или не превысит (f). Drongo, перед выполняемой функцией определяешь системное время с точностью до миллисекунд, потом то же самое после функции. И сравниваешь значения. Если интересно, ещё по поводу замеров fps могу посоветовать |
Отправлено: 14:06, 01-06-2008 | #7 |
Старожил Сообщения: 222
|
Профиль | Отправить PM | Цитировать А может этот кусок кода на ассемблере написать? Ток я ассемблера незнаю
|
------- Отправлено: 14:16, 01-06-2008 | #8 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать DaRiYs, Этот код работает долго для факториалов больше 13, потому что он неправильный. В какой-то момент он превращается в перебор всех целых чисел до нуля. Можете вставить отладочную печать и убедиться в этом самостоятельно.
|
------- Отправлено: 14:38, 01-06-2008 | #9 |
Старожил Сообщения: 222
|
Профиль | Отправить PM | Цитировать Цитата ivank:
|
|
------- Отправлено: 14:41, 01-06-2008 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Простые числа на Си++ | nemo555 | Программирование и базы данных | 13 | 13-03-2007 21:24 | |
*Теория* | Числа Фибоначчи | Grub | Программирование и базы данных | 8 | 28-07-2006 14:23 | |
четность числа | elfoflorien | Вебмастеру | 6 | 18-09-2005 20:49 | |
Случайные числа на JavaScript | Dimonweb | Вебмастеру | 2 | 12-08-2004 03:23 | |
суммироват числа | Artashes | Программирование и базы данных | 3 | 30-08-2003 18:31 |
|