Сейчас я пишу консольную программу в 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)!
Это так просто, как
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 - это оценка - я не рассчитали его).
if(i%2)
но используя другой цикл?
i++
, что вам нужно будет добавлять каждый раз, чтобы получить только нечетные числа?