循环以获得阶乘/指数的总和

Loop to get sum of factorial / exponent

你好,我写了一个循环来获得给定值 n 的阶乘之和除以 n 的递增指数。为了更好地描述它,它看起来像这样:

但出于某种原因,每当我输入数字时,我的循环总是返回值 1。 这是我的循环:

int nVal, i, j, k, nProduct = 1, nSum = 0, nFactorial = 1;
float fResult;

for (i = 1; i <= nVal; i++)
{
    for (j = 1; j <= nVal; j++)
    {
        nFactorial *= j;
        nSum += nFactorial;
    }
    for (k = 1; k <= nVal; k++)
    {   
        nProduct *= k;
    }
    fResult += (nSum * 1.0) / (nProduct * 1.0);
}

我可以尝试任何修复吗?

n 会有多大?这可以指定 nProductnFactorial 的类型应该是什么(例如 intlong long__int128double)。

nested/inner 循环是错误的。你只 want/need for 循环 i.

如果您等待计算比率,您将 [possibly/probably] overflow/underflow。因此,在每次迭代时都这样做。

你的阶乘计算线没问题。但是,nProduct 计算不正确。乘数必须是 n [而不是 j]。

您没有初始化 fResult,所以它以一个随机值开始(即未定义的行为)。如果您使用 -Wall [和 -O2] 编译以启用警告,这将被标记。

记住:

k! = (k - 1)! * k

而且,那:

n**k = n**(k - 1) * n

因此,我们可以在单个循环中迭代地构建 nFactorial 个子项和 nProduct 个子项。

我认为您的代码应该是这样的:

// pick _one_ of these:
#if 0
typedef int acc_t;
#endif
#if 0
typedef long long acc_t;
#endif
#if 0
typedef __int128 acc_t;
#endif
#if 1
typedef double acc_t;
#endif

double
calc1(int nVal)
{
    int i;
    acc_t nProduct = 1;
    acc_t nFactorial = 1;
    double ratio;
    double fResult = 0;

    for (i = 1;  i <= nVal;  ++i) {
        nFactorial *= i;
        nProduct *= nVal;

        ratio = (double) nFactorial / (double) nProduct;
        fResult += ratio;
    }

    return fResult;
}

OP的代码分子分母计算有误。此外,整数数学很容易溢出。

为了更好地处理大 n,根据前面的项用浮点数学计算每个项。

double sum_fact_expo(int n) {
  double sum = 0.0;
  double ratio = 1.0;
  for (int i = 1; i <= n; i++) {
    ratio *= 1.0*i/n;
    sum += ratio;
  }
  return sum;
} 
#include <stdio.h>

int main(void) {
  int nVal, i, j, k, nProduct = 1, nFactorial = 1;
  float fResult = 0;

  scanf("%d", &nVal);

  for (i = 1; i <= nVal; i++)
  {
    for (j = 1; j <= i; j++)
    {   
      //calculate 1! 2! 3! ... n!
      //actually calculate i!
      nFactorial *= j;
    }   
    for (k = 1; k <= i; k++)
    {   
      //calculate n^1 n^2 n^3 ... n^n
      //actually calculate n^i
      nProduct *= nVal;
    }   
    fResult += (nFactorial * 1.0) / (nProduct * 1.0);
    nProduct = 1;
    nFactorial = 1;
  }

  printf("%f\n", fResult);
  return 0;
}