在单个“for”循环内计算Factorial以计算系列的总和

时间:2014-02-28 21:02:48

标签: c visual-studio for-loop

我花了一段时间概念性地掌握了如何编写一个循环来编写一个给定系列的循环,其中使用了一个阶乘。

我编码了 - 然后我的老师告诉我们我们必须使用一个for循环。我似乎无法掌握如何做这样的事情。如何将产品的运行总量保持在多个数字上是没有意义的。

这是我的代码;其中包括嵌套的for循环。我非常感谢任何帮助。

int main() {

/*init variables*/
int N; //number of terms
float NUMER, DENOM = 1;
float FRAC, sum = 0, x;

/*asks user for value of N*/
printf("Input number of terms: ");
scanf("%i", &N);

/*asks user for value of x*/
printf("Input value of x: ");
scanf("%f", &x);

for (int n = 0; n <= N; n++) {
    NUMER = (pow(x, n)); //calculates numerator
    for (int fac = 1; fac <= n; fac++) { //calculates factorial using for loop
        DENOM = n * fac;
    }
    if (DENOM <= 0)
        printf("\n\nError, dividing by zero.\n\n"); //this is for debugging purposes; disregard
    FRAC = NUMER / DENOM; //calculates fraction
    sum += FRAC; //running sum of series
}
printf("\nSum of the series is %.1f\n\n", sum); //prints sum of series

return 0;

5 个答案:

答案 0 :(得分:4)

您想要DENOM = n!,因此您可以从DENOM = 1开始 并更新循环内的值:

DENOM = 1;
for (int n = 0; n <= N; n++) {
    NUMER = (pow(x, n)); //calculates numerator

    FRAC = NUMER / DENOM; //calculates fraction
    sum += FRAC; //running sum of series

    DENOM *= n+1;
}

答案 1 :(得分:4)

不是每次通过外循环计算x^nn!,而是可以初始化 在外循环之前的商为1.0,然后在每次通过外循环时, 乘以x/n得到系列中的下一个词。这将避免这种需要 调用pow(x,n),并使用内部循环来计算阶乘,每次都通过 外循环。

答案 2 :(得分:3)

如果你想一想如果手动计算一个阶乘法会怎么做,我想你可以很容易地弄清楚如何对它进行编码。

假设您正在尝试计算11!。好吧,你将从11开始,然后乘以10.现在你有110.现在乘以9.你有990.现在乘以8 ......

正如您所看到的,11, 10, 9, 8...系列就是您的for循环。只需将“当前答案”保留在变量中,并将其乘以for循环提供的数字。

答案 3 :(得分:0)

你得到一个更稳定的答案来反向循环。许多无限和在数值上更好地将最小的项首先加在一起。

  

f(x,n)= x ^ 0/0! + x ^ 1/1! + x ^ 2/2! + ... + x ^ n / n!

总和为S(x,n) = x/n
让最后两个项的总和为S(x,n-1) = x/(n-1) + x/(n-1)*S(x,n)
让最后3个项的总和为S(x,n-2) = x/(n-2) + x/(n-2)*S(x,n-1)
...
设N个最后项的总和为S(x,1) = x/(1) + x/(1)*S(x,1)

double e(double x, unsigned n) {
  double sum = 0.0;
  while (n > 0) {
    sum = x*(1 + sum)/n;
    n--;
  }
  sum += 1.0;  // The zero term
  return sum;
}

请注意,即使n大于1000,数学答案&lt; DBL_MAX,这个循环不会轻易地遇到浮点溢出。

[edit]但是如果代码必须在前向循环中完成,则下面计算每个术语不是可能溢出的单独产品,而是统一计算。

double e_forward(double x, unsigned n) {
  double sum = 1.0;
  double term = 1.0;
  for (unsigned i = 1; i <= n; i++) {
    term *= x / i;
    sum += term;
  }
  return sum;
}

答案 4 :(得分:0)

这似乎......很复杂。 Terseness是或可能是你的朋友:D

我不认为它需要比以下复杂得多:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

int main( int argc, char* argv[] )
{

  double limit = 10 ; // how far do we want to go?
  double x     =  2 ; // some value for X
  double xn    =  1 ; // by definition, for all X, X^0 is 1
  double nf    =  1 ; // by convention, 0! is 1
  double value =  0 ;
  double sum   =  0 ;
  double n     =  0 ;

  while ( n < limit )
  {
    value =  xn / nf ; // compute the next element of the series
    sum   += value   ; // add that to the accumulator
    xn    *= x       ; // compute the *next* value for X^n
    nf    *= (++n)   ; // compute the *next* value for N!
  }

  return 0;
}