2011-03-31 115 views
2

所以我写了一个递归程序,询问用户现在想要执行的许多斐波那契数。我遇到的问题是,在第45个号码之后,它给了我一个带有“ - ”的号码,并且它的号码不符合顺序。我怎样才能改变这个来给我正确的号码?这里是执行计算的代码的递归部分:递归斐波那契数列

void fibonacci (int a, int b, int n, int count) 
{ 
    if(n < count) 
    { 
     cout<<a+b<<endl; 
     fibonacci(b, a+b, n+1, count); 
    } 
} 

这里的序列的输出:

How many numbers do you want the Fibonacci sequence to process: 50 
The starting numbers for the sequence are: 0, 1 
1 
2 
3 
5 
8 
13 
21 
34 
55 
89 
144 
233 
377 
610 
987 
1597 
2584 
4181 
6765 
10946 
17711 
28657 
46368 
75025 
121393 
196418 
317811 
514229 
832040 
1346269 
2178309 
3524578 
5702887 
9227465 
14930352 
24157817 
39088169 
63245986 
102334155 
165580141 
267914296 
433494437 
701408733 
1134903170 
1836311903 
-1323752223 
512559680 
-811192543 
-298632863 
-1109825406 

做什么样的变化,我需要以使它改变 - #对真实的数字?

回答

9

你遇到了问题,因为你使用datatypeint是32位,只能容纳值高达2^31-1 = 2147483647时signed(默认情况下,使用31位,1位被占用指示signedness,这也解释了负数),2^32-1 = 4294967295时unsigned。你可以在这里使用64位数据类型(大多数情况下为long long),但也会在稍后发生问题(约94位斐波那契数,我认为)。

这个问题的“真正”解决方案是编写自己的数值计算方法,并使用自己的数字表示法f.e.一串字符。您还可以查找使用“bignum”库的各种可能性之一。您应该在一些SO问题中找到关于此的更多信息,例如this one

+4

另外,最好使用'unsigned'类型来处理那些不能被是负面的。 – Xeo 2011-03-31 17:08:25

+0

顺便说一句,考虑将负面表达的确切原因添加到您的答案,这使得它更完整。 – Xeo 2011-03-31 17:15:33

+0

@Xeo不依据大多数专家。无符号通常被理解为意味着位操作或调制算术是必需的。 – 2011-03-31 17:18:10

0

只能保存32位数据,最大值为2,147,483,647。您的返回值是“溢出”。使用ulong数据类型,其中包含64位,最大值为18,446,744,073,709,551,615。

1

声明你的变量为unsigned int将允许你做更多的交互,但是你会遇到问题。使用long long int扩展变量的大小仍然会延迟您的问题。你不能解决这个问题,因为迟早你会超过你可以表示的最大数量,无论你选择哪种数据类型

+0

或者你会用完内存。 BigInt的某些实现将允许“无限”的精度,但最终“无限”永远不会大于可用内存的数量。 – 2011-03-31 17:19:29