如何用C#编写此公式? (我的编码方式有什么问题吗?)

时间:2018-11-22 23:52:06

标签: c# math formula

祝您一切顺利 如果您能解决这个问题,我会很高兴... Thnx

我为公式写了以下代码:“ http://up.upinja.com/zvhev.png

Console.WriteLine("Enter two Numbers to start the Equation (X=Number , N=Power)" + "");
int X = int.Parse(Console.ReadLine());
int N = int.Parse(Console.ReadLine());
double sum = 0;
double up = 1;
int down = 1;

double sentence;
for (int i = 1; i < N; i++)
{
up = Math.Pow(X, N);
down = N * i;
sentence = up / down;
sum += sentence;
}
Console.WriteLine("The Sum is : " + sum);

我希望该数学公式以C#方式完成。 我的代码正在运行,但我得到错误的答案... 您能帮我修复它吗?

4 个答案:

答案 0 :(得分:0)

n!代表阶乘。请参阅Factorial以了解有关阶乘的信息。

C#中的样本阶乘函数如下:

long Factorial(long value)
{          
    if (value == 0)
        return 1;

    return value * Factorial(value - 1);
}

此外,以下行需要更正。

up = Math.Pow(X, N);

指数部分需要根据您的公式增加。必须是

up = Math.Pow(X, i);

答案 1 :(得分:0)

使用此:

Console.WriteLine("Enter two Numbers to start the Equation (X=Number , N=Power)" + "");
int X = int.Parse(Console.ReadLine());
int N = int.Parse(Console.ReadLine());
double sum = 0;
double up = 1;
int down = 1;

double sentence;
for (int i = 1; i <= N; i++)
//Change < to <=
{
    up = Math.Pow(X, i);
    //This is a for loop i created to get the factorial of any number, sometimes creating your own functions may be worth it
    for (int a = N, a > 0, a--)
    {
     //Function of this Loop : multiply the value of the denominator by its value - 1 to get the factorial of  the number
        down *= a;
    } 
    sentence = up / down;
    sum += sentence;
}
Console.WriteLine("The Sum is : " + sum);

答案 2 :(得分:0)

您实际上可以将其简化很多。但是首先,您现有代码的问题在于您没有正确计算i!。您现在正在实际计算的顺序是:

X^N / N + X^N / (2 * N) + X^N / (3 * N) + ... + X^N / ((N - 1) * N)

几件事: -循环中存在一对一的问题 -分子被提高到错误的幂 -这些的分母必须为i!

通过简单的递归关系定义框架:

i! = i * (i - 1)!0! = 1

或者换句话说,是前i个连续自然数的乘积。因此,纠正此问题的一种方法是创建一个称为Factorial的方法:

static long Factorial(int i) 
{ 
    long product = 1;
    while (i > 0) {
        product *= i;
        --i;
    }
    return product;
}

然后您可以通过以下方式修复循环:

for (int i = 1; i < N; i++)
{
    sum += Math.Pow(X, i) / Factorial(i);
}

但是,我们在循环的每个迭代中都不需要做很多工作。这就是简化的地方。第i项的通用公式是:

C[i] = X^i / i!

但是我们也可以用之前的术语来写:

C[i] = C[i-1] * X / i

所以我们可以这样重写循环:

double lastTerm = 1;
for (int i = 1; i <= N; ++i)
{
    // Cast to double here or, probably better, make X a double in the first place.
    lastTerm *= (double) X / i;
    sum += lastTerm;
}

这有几个优点:

  • 通常会更快,因为我们每次迭代的工作量都减少了(Math.Pow计算任意幂,因此它比乘法要慢一些)。
  • 不太容易出现数字问题。阶乘变得非常快。其实21!已经太大而无法存储在long中,因此,如果您的N太大,一切都会破裂。

答案 3 :(得分:-4)

战利品错误,应该增加价值

    up = Math.Pow(X, i);