C# 如何在C中计算这种类型的方程(x^1+…x^n)?

C# 如何在C中计算这种类型的方程(x^1+…x^n)?,c#,math,mathematical-optimization,C#,Math,Mathematical Optimization,我有一道数学题,它是这样写的: x^1+x^2+x^3+...+x^n 在C语言中有什么结构可以帮助我解这些方程吗 我知道我可以编写for循环或使用递归来实现这一点,但我记得读过一些c中的构造,这些构造将预编译这样的语句以供以后执行 有什么有趣的方法可以解决这类方程吗?要计算x^n,请使用: 如果要计算总和,可以使用循环或LINQ。我认为这里的简单循环没有任何问题: double total = 0; for (int i = 1; i <= n; ++i) { total +=

我有一道数学题,它是这样写的:

x^1+x^2+x^3+...+x^n
在C语言中有什么结构可以帮助我解这些方程吗

我知道我可以编写for循环或使用递归来实现这一点,但我记得读过一些c中的构造,这些构造将预编译这样的语句以供以后执行

有什么有趣的方法可以解决这类方程吗?

要计算x^n,请使用:

如果要计算总和,可以使用循环或LINQ。我认为这里的简单循环没有任何问题:

double total = 0;
for (int i = 1; i <= n; ++i)
{
    total += Math.Pow(x, i);
}
Console.WriteLine(total);
在其他更复杂的情况下,找到公式可能更困难。

您可能正在谈论使用委托来延迟执行。但在许多情况下,这与编写方法是一样的。例如,让我们从简单的方法开始:

int total = 0;
for(int i = 1; i <= n; i++)
    total += Math.Pow(x, i);
public static double SumExponents(double x, int n)
{
    double total = 0;
    for (int i = 1; i <= n; i++)
    {
         total += Math.Pow(x, i);
    }
    return total;
}
然后,您可以将其编写为单个lambda表达式:

Func<double, int, double> func = (x, n) => Enumerable.Range(1, n)
                                              .Select(i => Math.Pow(x, i))
                                              .Sum();

那是你一直在想的事情吗?如果没有,请澄清你的问题。你要找的东西并不明显。

对于C语言来说没有什么特别的。你可以在O1时间内计算出这个总和。假设功率运行需要恒定的时间

在你的情况下,公式是

x*(x^n - 1)/(x - 1)

除了select\sum,您还可以对折叠序列使用聚合

int n;
double x;
double result = Enumerable.Range(1, n)
    .Aggregate(0.0, (acc, i) => acc + Math.Pow(x, i));

我知道你的例子是故意的琐碎。然而,如果你真正想要计算的仍然是一个多项式,那么你一定要使用。这是。

谢谢,乔恩。我只是好奇是否还有其他方法可以实现这一点,而我却没有想到。@Sonic:那就是你当时想到的那种建议吗?还是你还在寻找更多的选择?是的。仍在消化几何级数示例,但这再次向我保证,我没有遗漏其他一些简洁的方法。谢谢这是一个很棒的例子,正是我想要的!关于几何级数非常有趣。这个公式怎么能插入c?@Sonic Soul:更新。请注意,这会计算与ar^0相对应的额外项,您的示例中没有包含该项,因此,如果您只想从r^1向上减去该项,则必须减去该项。为了解决你给出的例子,我想你需要调用几何经验1,x,n-1.+1来表示霍纳的方案。我打算自己回答这个问题。与计算pow调用的总和相比,Horner方案的效率更高,一般更准确。比幂和更有效,只需要n次乘法和n次加法,根本不需要幂,并且比幂和和几何级数更稳定。想想当r非常接近1时会发生什么。
Func<double, int, double> func = (x, n) => Enumerable.Range(1, n)
                                              .Select(i => Math.Pow(x, i))
                                              .Sum();
x*(x^n - 1)/(x - 1)
int n;
double x;
double result = Enumerable.Range(1, n)
    .Aggregate(0.0, (acc, i) => acc + Math.Pow(x, i));