На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Возможно ли оптимизировать вычисление факториала?
    Необходимо вычислить выражение
    res = !n - !(n-1) + !(n-2) - ...


    Вот код который я написал:
    ExpandedWrap disabled
              private static int Calculate(int n)
              {
                  if (n < 0)
                      throw new ArgumentException("Input parameter can't be less then zero", "n");
       
                  int currentFact = n % 2 == 0 ? 1 : -1;
                  int currSumm = currentFact;
                  for (int i = 1; i <= n; i++)
                  {
                      currentFact *= i * (-1);
                      currSumm += currentFact;
                  }
       
                  return currSumm;
              }


    Возможно ли его еще оптимизировать?
      Да факториал от отрицательных тоже существует, всетаки это Гама ф-ия.

      Так что обработку исключения можно убрать.

      А каков ваш алгоритм? напишите словами.
        Цитата 2005fs @
        Возможно ли его еще оптимизировать?

        Разве что таблицей
          Можно это выражение считать приблизительно. Если n! вынести за скобки, то в скобках останется знакопеременный ряд очень быстро убывающий. То есть достаточно вычислять два - три члена этого ряда.
            Возьмем ряд тейллора найдем наиболее похожую из известные функций ch(x) и sh(x)
            user posted image
            user posted image
            Ясно что нам нужно ch(x)- sh(x)=e^(-x)

            user posted image
            возьмем x=1 чтобы в числителях получить 1^n=1
            Возьмем первые n элементов приведём к одному знаменателю n!
            получим
            (!n - !(n-1) + !(n-2) ..)/!n
            И того e^(-1)*n!

            user posted image
            Возможно надо точнее опраксимировать факториал, но для cкорости возьмем эту формулу
            sqrt(2*pi*n)*(n/e)^n/e=sqrt(2*Pi*n)*power(n,n)/power(e,n+1)
            Сообщение отредактировано: Pavia -
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0205 ]   [ 15 queries used ]   [ Generated: 20.06.25, 08:55 GMT ]