【发布时间】:2016-10-25 15:28:34
【问题描述】:
我正在做项目 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) - (grid + i)
paths /= (i + 1);
}
Console.WriteLine(paths);
Console.ReadKey();
为什么这段代码是错误的?这与 mathblog 网站完全相同,但只有 1 行。
int grid = 20;
long paths = 1;
for (int i = 0; i < grid; i++)
{
paths *= ((grid * 2) - i) / (i + 1);
}
Console.WriteLine(paths);
Console.ReadKey();
但是为什么这段代码是正确的呢?是不是和前面的代码一样?它不完全遵循数学算法吗?因为是n-k+i/i,而这段代码做n-i/i
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();
谢谢各位!
【问题讨论】:
-
尝试使用
double paths而不是long。只要是整数,您的问题可能是除法中的向上舍入 -
您的第二个代码块与您链接的 URL 中的代码不同。如果你想单行的话,应该是
paths = (paths * (grid * 2) - i) / (i + 1);。你写的和paths = paths * (((grid * 2) - i) / (i + 1));一样 -
(grid * 2) - (grid + i) => (2 * grid - grid) - i => grid - i
-
第二个代码和最后一个代码不一样的原因是您使用的是整数运算。
-
不,不是 - 只需将一些数字插入 - grid = 20, i = 1 然后你会看到 (2 * 20) - (20 -1) = (40 - 19) = 21, (2 * 20) - 1 = 39
标签: c# algorithm grid binomial-coefficients