C# C中第94个斐波那契数的错误
我在计算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)
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,所有与数据类型相关的内容对我来说都是新的。