我正在做项目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家伙!
答案 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。博客在没有提到这一点时没有多大帮助。