Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中第94个斐波那契数的错误_C#_Algorithm_Overflow_Fibonacci - Fatal编程技术网

C# C中第94个斐波那契数的错误

C# C中第94个斐波那契数的错误,c#,algorithm,overflow,fibonacci,C#,Algorithm,Overflow,Fibonacci,我在计算C中的斐波那契数,我得到了错误的数字,因为数字是94 这是我的密码 static void Main(string[] args) { string N = Console.ReadLine(); ulong n = ulong.Parse(N); ulong[] fibonacci = new ulong[n+1]; fibonacci[0] = 0; if (n == 1)

我在计算C中的斐波那契数,我得到了错误的数字,因为数字是94

这是我的密码

    static void Main(string[] args)
    {
        string N = Console.ReadLine();
        ulong n = ulong.Parse(N);
        ulong[] fibonacci = new ulong[n+1];
        fibonacci[0] = 0;
        if (n == 1)
        {
            fibonacci[1] = 1;
        }
        if (n>=2)
        {
            fibonacci[1] = 1;
            for (ulong i = 2; i < n+1; i++)
            {
                fibonacci[i] = (ulong)fibonacci[i-1] + (ulong)fibonacci[i-2];
            }
         }
     }

     Console.WriteLine(fibonacci[n]);
直到第93个号码是12200160415121876738,我还可以,但第94个号码是1293530146158671551,真正的号码是1974027421988223167

我不知道我的代码有什么问题。

号码是18446744073709551615

您正在尝试存储197402742219868223167,比这个大。默认情况下,ulong在溢出时不会引发异常,但可以通过在代码周围添加选中的{}来强制引发异常:

checked
{
    fibonacci[i] = (ulong)fibonacci[i-1] + (ulong)fibonacci[i-2];
}
然后运行您的代码,果然,我们得到:

System.OverflowException:算术运算导致溢出

幸运的是,.NET中有一种类型用于处理真正大的整数。它叫

更改代码以使用它相对来说很简单:

string N = Console.ReadLine();
ulong n = ulong.Parse(N);
BigInteger[] fibonacci = new BigInteger[n+1];
fibonacci[0] = 0;
if (n == 1)
{
    fibonacci[1] = 1;
}
if (n>=2)
{
    fibonacci[1] = 1;
    for (ulong i = 2; i < n+1; i++)
    {
        fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];
    }
 }
您的代码现在可以按预期工作并输出:

19740274219868223167

即使将输入更改为900,仍然有效:

54877108839480000514136739483714443800519309123592724449534270398112010643412349954387521529061550449494949909218744121824667910473144247330220139801604070070171756973179004832756652938800


我认为您不需要在ulong类型中存储N的数量! 它也可以存储为int! 最重要的部分是存储第n个斐波那契数的值。 您可以更简洁地计算它,而无需考虑构造最后一个数字的大数组

public static void Main(string[] args)
    {
        string N = Console.ReadLine();
        int n = int.Parse(N);
        BigInteger[] fibonacci = new BigInteger[3];
        fibonacci[0] = 0;
        fibonacci[1] = 1;
        fibonacci[2] = 1;
        
        if (n>=3)
        {
            for (int i = 3; i < n+1; i++)
            {
                fibonacci[0]=fibonacci[1];
                fibonacci[1]=fibonacci[2];
                fibonacci[2]=fibonacci[1]+fibonacci[0];
            }
         }
         Console.WriteLine(fibonacci[2]);
     }

无符号长字符的最大值为18446744073709551615。您希望存储一个大于该值的值,但这是行不通的。我建议你看看BigInteger。所以,我只需要将ulong改为BigInteger?是的,这是正确的。旁注:不需要将所有斐波那契数存储在一个数组中;两个数字就足够了谢谢,解决方案真的很简单,至少。谢谢!。我来自python,所有与数据类型相关的内容对我来说都是新的。