运行以下代码时,我最终得到负值。我只使用正数,所以我真的很困惑。我试图看看这个负数是否是一个返回代码,但似乎没有任何代码将此作为数字返回。
public static int fib(int n)
{
int a = 0;
int b = 1;
for (int i = 0; i < n; i++)
{
int temp = a;
a = b;
b = temp + b;
}
return b;
}
static void Main(string[] args)
{
int n = 0;
bool Run = true;
while (Run == true)
{
n = fib(n + 1);
Console.WriteLine(n);
}
}
以下是代码运行时的结果:
1
2
3
5
13
610
-121099088
1
答案 0 :(得分:12)
你只是看到整数溢出。您正在尝试计算fib(610)
,这比Int32
可以容纳的更多 - 当您将两个大整数相加时,您将获得一个负数。
如果您在“已检查”模式下构建它,则会抛出异常 - 或者您只能为所需的一个表达式执行此操作:
for (int i = 0; i < n; i++)
{
int temp = a;
a = b;
b = checked(temp + b);
}
有关checked arithmetic的更多信息,请参阅MSDN。
答案 1 :(得分:7)
这是整数溢出和使用twos' complement表示整数的结果。
在C#中,默认情况下不检查整数溢出。如果您确实更改为checked
上下文,则会出现例外情况。
使用checked
上下文,使用uint
甚至ulong
- 您需要确保使用的数据类型可以包含您正在计算的值。
答案 2 :(得分:1)
您的代码正在计算第五个&#39; Fibonacci数字,但它已经得到它的数字&#39; n&#39;从以前的计算。我的猜测是第610个斐波那契数字溢出了int。如果要继续使用此逻辑,请使用unsigned uint或ulong。否则,您需要修改自己确定的方式&#39; n&#39;用于斐波纳契计算。