为什么以下代码有误?二项式系数

时间:2016-10-25 15:28:35

标签: c# algorithm grid binomial-coefficients

我正在做项目euler,我现在遇到问题15,这是一个链接: https://projecteuler.net/problem=15。我试图用二项式系数来解决这个问题。这是一个解释它的网站:http://www.mathblog.dk/project-euler-15/。你可以在底部找到它。

我的问题是,为什么以下代码有误?因为这遵循我认为的数学算法:n-k + i / i

        int grid = 20;
        long paths = 1;
        for (int i = 0; i < grid; i++)
        {
            paths *= ((grid * 2) - i) / (i + 1);
        }
        Console.WriteLine(paths);
        Console.ReadKey();

为什么这段代码错了?这与mathblog网站完全相同,但在一行中。

       int grid = 20;
        long paths = 1;
        for (int i = 0; i < grid; i++)
        {
            paths *= ((grid * 2) - i);
            paths /=  (i + 1);
        }
        Console.WriteLine(paths);
        Console.ReadKey();

但为什么这个代码正好呢?它和以前的代码不一样吗?它并不完全遵循数学算法吗?因为它是n-k + i / i,而且这个代码确实是n-i / i

If (Target.Address = "$G$2") And (LCase(Target.Value) = "yes") And (LCase(Target.Offset(1).Value) = "yes") Then
    Row("4").EntireRow.Hidden = True

Thnx家伙!

2 个答案:

答案 0 :(得分:2)

如果你想合并计算,它应该是这样的

paths = (path *((grid * 2) - i))/(i + 1);

答案 1 :(得分:0)

按照惯例,在许多编程语言中,int / int给出一个int,*不是浮点数。您的方法意味着&#39;路径&#39;应该采用非int的值。事实上,这三种方法都不应该起作用,但巧合的是巧合,最后一种方法起作用:基本上是因为所有中间值的“路径”都是如此。碰巧也是二项式系数。

调试建议:让程序输出中间值。这有很大帮助。

*:作为一名数学家,我几乎从不需要这个功能。实际上,另一个约定(int / int - &gt; double)会让我作为程序员的生活变得更容易。

我看了你提到的博客。这使您的信息更容易理解。 博客提到了一个公式:i的产品从1到k(n-k + 1)/ i。 所以要模仿它你需要写

    for (int i = 1; i <= grid; i++) // bounds!
    {
        paths *= (grid * 2) - (grid - i) // minus sign!
        paths /= (i + 1);
    }

关于这与int一起使用的事实:这是一个事故,因为产品的中间值(在每个循环的末尾)是整个计算中的二项式系数。如果你要用另一个顺序计算产品和除法,你很可能得到非整数,因此计算会因路径的整数变量类型而失败,因为常规int / int - &gt; INT。博客在没有提到这一点时没有多大帮助。