【发布时间】:2020-12-09 21:11:57
【问题描述】:
我一直在开发一种将帕斯卡三角形输出为列表的方法。
例如:输出PascalsTriangle(4) 将返回一个列表,其中包含:
(1 1 1 1 2 1 1 3 3 1).
问题出在尝试输出 PascalsTriangle(14) 及以上时,因为它不会显示正确的值。
对于第 14 行,它将给出:1 4 24 88 221 399 532 532 399 221 88 24 4 1 这是错误的。
第 14 行的正确值为:1 13 78 186 715 1287 1716 1716 1287 715 186 78 13 1
注意:第 14 行之前的所有帕斯卡三角形值都是正确的(据我所知)。
在第 14 行之后,它继续输出数字,甚至变成负数,这甚至是不可能的。
代码如下:
using System;
using System.Collections.Generic;
namespace PascalsTriangle
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter size of triangle: ");
List<int> number = PascalsTriangle(int.Parse(Console.ReadLine()));
number.ForEach(Console.WriteLine);
}
// formula for pascals triangle: n!/k!(n - k)!
// where ! means factorial and
// where n = row and k = position in row.
public static List<int> PascalsTriangle(int n)
{
List<int> triangle = new List<int>();
int temp = 0;
for (int i = 0; i < n; i++)
{
for (int x = 0; x <= i; x++)
{
if (x == 0 || x == i)
{
triangle.Add(1);
}
else
{
temp = (factorial(i)) / (factorial(x) * factorial(i - x));
triangle.Add(temp);
}
}
}
return triangle;
}
public static int factorial(int number)
{
if (number == 0)
{
return 1;
}
int factorial = number;
while (number > 1)
{
factorial *= --number;
}
return factorial;
}
}
}
问题似乎在于列表中的数字开始变为 4 位值,因为那是代码开始停止按预期工作的时候。
任何帮助将不胜感激:)
【问题讨论】:
-
你得到整数溢出。在您的应用中将
int更改为long,它将输出正确的值。 -
另一个更强大的修复可能是编写另一个计算阶乘(a)/阶乘(b)的方法,考虑到这只是Π_{i = b+1}^a i,这将避免一些溢出