Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ....
От: senglory  
Дата: 16.06.10 22:44
Оценка:
Надо написать расчет формулы n! — (n-1)! + (n-2)! — ...
Причем самый скоростной. Какие есть варианты?
Re: Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ....
От: MBo  
Дата: 17.06.10 03:15
Оценка:
Здравствуйте, senglory, Вы писали:

S>Надо написать расчет формулы n! — (n-1)! + (n-2)! — ...

S>Причем самый скоростной. Какие есть варианты?

Посчитать можно за линейное относительно n время.
Замкнутая формула или приближение вроде ф.Стирлинга, похоже, неизвестны: http://www.research.att.com/~njas/sequences/A005165
Re: Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ....
От: SnowBlast Казахстан  
Дата: 17.06.10 03:52
Оценка:
Здравствуйте, senglory, Вы писали:

S>Надо написать расчет формулы n! — (n-1)! + (n-2)! — ...

S>Причем самый скоростной. Какие есть варианты?
(N div 4) * (N + N mod 2 +2)?
Как улитка с параличем мчится мысль неудержимо, центр речи возбуждая
Re[2]: Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ...
От: dilmah США  
Дата: 17.06.10 04:06
Оценка:
MBo>Посчитать можно за линейное относительно n время.

ну, учитывая, что количество цифр/байт в факториале растет тоже линейно, то наверно реально получится квадратичная сложность.
н
Re[2]: Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ...
От: SnowBlast Казахстан  
Дата: 17.06.10 04:07
Оценка:
Здравствуйте, SnowBlast, Вы писали:

SB>Здравствуйте, senglory, Вы писали:


S>>Надо написать расчет формулы n! — (n-1)! + (n-2)! — ...

S>>Причем самый скоростной. Какие есть варианты?
SB>(N div 4) * (N + N mod 2 +2)?.
Ой-ей-ей, как я затупил
Как улитка с параличем мчится мысль неудержимо, центр речи возбуждая
Re: Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ....
От: Буравчик Россия  
Дата: 17.06.10 05:29
Оценка:
Здравствуйте, senglory, Вы писали:

S>Надо написать расчет формулы n! — (n-1)! + (n-2)! — ...

S>Причем самый скоростной. Какие есть варианты?

Для n = 5:
5! — 4! + 3! — 2! + 1! — 0! = 120 — 24 + 6 — 2 + 1 — 1 = 100

5! — 4! + 3! — 2! + 1! — 0! = 5*4*3*2 — 4*3*2 + 3*2 — 2
Выносим за скобку двойку, затем тройку и т.д. = ((((5-1)*4+1)*3)-1)*2 = 100

Общее решение:
long long factsum(int n) {
    long long p = 1;
    int d = -1;
    while (n) {
        p = p*n-- + d;
        d = -d;
    }
    return p;
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Best regards, Буравчик
Re: Самый быстрый алгоритм для n! - (n-1)! + (n-2)! - ....
От: Socrat Россия  
Дата: 17.06.10 05:31
Оценка: :)
Здравствуйте, senglory, Вы писали:

S>Надо написать расчет формулы n! — (n-1)! + (n-2)! — ...

S>Причем самый скоростной. Какие есть варианты?

Если вынести общий множитель за скобки, то получается:
n! — (n-1)! = ((n)-1)(n-1)!
((n)-1)(n-1)! + (n-2)! = (((n)-1)(n-1)+1)(n-2)!
...

Тогда получается что-то вроде:

int sign=-1;
int res=1;
while (n>0)
{
    res = res * n-- + sing;
    sign = -sign;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.