Как рассчитать сумму (2i + 1)! используя цикл while?

0

Сейчас я пишу консольную программу в visual studio.
Моя программа должна рассчитать сумму следующих серий:

1!+3!+5!+...+(2N+1)!,  

где N - целое число, большее 0 (пользователь должен сначала ввести N).

К сожалению, я могу рассчитать сумму 1!+2!+3!+...(N)!

/* Calculates sum of 1!+2!+3!+...+(N)! */

#include <iostream>
using namespace std;

int main()
{

    int i=1, n, fact = 1, sum = 0;

    cout<<"Enter n";
    cin >> n;

    while(i <= n)
    {
        fact = fact * i;
        i++;
        sum = sum + fact;
    }

    cout<<"Sum is "<<sum<<"\n";
    return 0;
}    

Итак, как я могу сделать свою программу для вычисления суммы

1!+3!+5!+...+(2N+1)!
  • 0
    Каждый раз, когда вы добавляете 1 с помощью i++ , что вам нужно будет добавлять каждый раз, чтобы получить только нечетные числа?
  • 0
    @MorphingDragon Хорошо, если я переписываю его как 'i + 2', зная, что i = 1, чтобы получить нечетные числа, то я получаю неправильный вывод.
Показать ещё 1 комментарий
Теги:
visual-studio
loops
while-loop

1 ответ

2
Лучший ответ

Это так просто, как

while(i <= 2*n+1)
{
    fact = fact * i;
    if (i%2)
        sum = sum + fact;
    i++;
}

Вы хотите, чтобы цикл повторялся каждый раз, так что ваши умножения включают четные числа, а также нечетные числа (иначе второй член будет 3*1, а не 3*2*1); но это только тогда, когда вы смотрите на нечетное число, которое вы хотите добавить к итогу.

Альтернативой является цикл только на нечетные числа, но каждый раз умножать на текущее число и его предшественника:

while(i <= 2*n+1)
{
    fact = fact * i * (i>1 ? i-1 : 1);
    sum = sum + fact;
    i+=2;
}

Это немного сложнее. Вы теперь зацикливаете только на нечетные числа (из-за i+=2, поэтому вам нужно на каждом этапе умножить на i и на i-1. Но вам нужно быть осторожным на первом шаге: когда i==1, вы не хотите умножать на 0! Поэтому нам нужно трехмерное выражение, чтобы убедиться, что этого не произойдет.

Или мы могли бы начать с i=3:

int i=3, sum=1, fact=1;
while(i <= 2*n+1)
{
    fact = fact * i * (i-1);
    sum = sum + fact;
    i+=2;
}

Теперь это работает так, как ожидалось, но мы должны инициализировать sum до 1 потому что цикл теперь пропускает случай, когда i==1. Возможно, это чище.

Но учтите, что вам не удастся зайти слишком далеко, прежде чем вы нажмете переполнение int ! Вы получите немного дальше с long long, но даже в этом случае факториалы огромны, и вы захотите использовать произвольный класс целочисленного размера к моменту, когда вы нажмете n==10 или около того (10 - это оценка - я не рассчитали его).

  • 0
    Спасибо! Ваш ответ действительно полезен. Но есть ли другой способ сделать это? Я имею в виду, не используя if(i%2) но используя другой цикл?
  • 0
    @KiberPrestupnik Я добавил несколько дополнительных вещей, чтобы показать вам, как этого избежать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню