Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Ускорение поиска числа факториала

Ответить
Настройки темы
C/C++ - Ускорение поиска числа факториала

Старожил


Сообщения: 222
Благодарности: 1

Профиль | Отправить 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;
}
В файле input.txt лежит значение факториала N! числа N, а в файле output.txt должно быть записано значение N.
Как ускорить алгоритм расчета?

Отправлено: 13:00, 01-06-2008

 

Аватара для Altair86

Новый участник


Сообщения: 15
Благодарности: 2

Профиль | Отправить PM | Цитировать


Мне кажется, алгоритм расчета тут не ускорить. Если бы числа были большими, можно было бы поискать приближенную формулу для вычисления. А так-- только последовательное деление на целые числа, начиная с 1, все правильно. int 32-разрядные вроде? примерно до 2*10^9-- это факториалы чисел до 12 или 13 только.

-------
Будь проклят тот день, когда обезьяна слезла с дерева и научилась говорить...


Отправлено: 13:47, 01-06-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


Не понимаю, почему медленно он работает.
Вот пример на JavaScript'е (ну не знаю я C), который отрабатывает мгновенно (учитывайте, что int - не безразмерен):
HTML код: Выделить весь код
var fak = 39916800; // можно оформить в виде функции и передавать это число в неё, но для теста пойдёт и простое присваивание. Это число - факториал от 11. var i = 2; while(i) { if (fak == i) { alert("Заданное число является факториалом от " + i); break; } if (fak/i == parseInt(fak/i)) fak = fak/i; else { alert("Нет такого числа!"); break; } i++; }

Попробуйте изменить fak, скажем, на 39916801 и число найдено не будет.

Отправлено: 13:50, 01-06-2008 | #3


Старожил


Сообщения: 222
Благодарности: 1

Профиль | Отправить PM | Цитировать


Altair86 Нет я помню точно гдето видел чото тип какойто формулы или спец метода. Но не помню где.
По инету шарил но ненашол.
Алгоритм быстрее этого точно есть.
Coutty мне нада скорость до 1 секунды, а при некоторых значениях скорость 1,015сек. Ето в моей ситуации неприпустимо. Используются факториалы чисел до 2000, тоесть максимально 2000!

-------
Подпись, нарушающая правила конференции, отредактирована администратором


Отправлено: 13:51, 01-06-2008 | #4


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


http://en.wikipedia.org/wiki/Factorial#Rate_of_growth

Там есть только приблизительные формулы, для вычисления n! по n, Если вычислять в обратную сторону по требуется на порядок больше операций, чем для честного деления. Потому что, уже указали, что в int поместится только 12!. Т.е. в для такой операции достаточно всего 12 операций делений.

-------
http://ivank.ru


Отправлено: 14:00, 01-06-2008 | #5


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


DaRiYs,
Цитата DaRiYs:
мне нада скорость до 1 секунды, а при некоторых значениях скорость 1,015сек. »
А как вычислялось время вычисления? Я тоже хочу несколько программ проверить, вернее алгоритмы и сравнить.

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 14:04, 01-06-2008 | #6


Аватара для Coutty

Кот Ти


Сообщения: 7318
Благодарности: 1204

Профиль | Отправить PM | Цитировать


DaRiYs, так вот Altair86 и говорит - в Int влезет факториал не более чем от 12 или 13.

Иногда для скорости можно пожертвовать объёмами. Используйте подстановочные таблицы с заранее сопоставленными величинами (пусть не для всех чисел, а, скажем, каждое двадцатое. Остальные просчитывать).
Алгоритм:
1. Находим число (a), которое меньше полученного из файла (f) (следующее число из таблицы будет уже больше).
2. Определяем сопоставляемое этому значению число (b).
3. И число (a) умножаем на (b++), пока произведение не будет равно или не превысит (f).

Drongo, перед выполняемой функцией определяешь системное время с точностью до миллисекунд, потом то же самое после функции. И сравниваешь значения. Если интересно, ещё по поводу замеров fps могу посоветовать

Отправлено: 14:06, 01-06-2008 | #7


Старожил


Сообщения: 222
Благодарности: 1

Профиль | Отправить PM | Цитировать


А может этот кусок кода на ассемблере написать? Ток я ассемблера незнаю

-------
Подпись, нарушающая правила конференции, отредактирована администратором


Отправлено: 14:16, 01-06-2008 | #8


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


DaRiYs, Этот код работает долго для факториалов больше 13, потому что он неправильный. В какой-то момент он превращается в перебор всех целых чисел до нуля. Можете вставить отладочную печать и убедиться в этом самостоятельно.

-------
http://ivank.ru


Отправлено: 14:38, 01-06-2008 | #9


Старожил


Сообщения: 222
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата ivank:
DaRiYs, Этот код работает долго для факториалов больше 13, потому что он неправильный. »
А какой правильный тогда?

-------
Подпись, нарушающая правила конференции, отредактирована администратором


Отправлено: 14:41, 01-06-2008 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Ускорение поиска числа факториала

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Простые числа на Си++ 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




 
Переход