【问题标题】:Pascals Triangle method not working after 14th row帕斯卡三角法在第 14 行后不起作用
【发布时间】: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,这将避免一些溢出

标签: c# list


【解决方案1】:

您对temp 的计算溢出。 您可以使用更大的数据类型(如longBigInteger), 但阶乘增长很快,因此使用不同的计算方法可能会更好temp

您计算的是二项式系数,请参阅this StackOverflow answer 了解如何实现它。 然后用它代替(factorial(i)) / (factorial(x) * factorial(i - x))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多