2011-03-31 4 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 

가가를 변경하려면 다음은 계산을 실행하는 코드의 재귀 부분은 진짜 숫자에요? 사용중인 datatypeint (가) 32 비트 만 값을 보유 할 수 있기 때문에

답변

9

당신은 문제가 실행중인 최대 2^31-1 = signed (기본적으로 31 비트를 사용하는 경우, 1 개 비트를 표시하기 위해 점령 2147483647 signedness), unsigned 일 때 2^32-1 = 4294967295가됩니다. 여기에서는 64 비트 데이터 유형 (대부분의 경우 long long)을 사용할 수 있지만 나중에이 문제 (94 번째 피보나치 수를 중심으로 생각합니다)에서 문제가 발생합니다.

이 문제의 "실제"해결책은 수치 계산을위한 고유의 방법을 작성하고 숫자의 자체 표현을 사용하는 것입니다. char의 배열 "bignum"라이브러리를 사용하기 위해 다양한 가능성 중 하나를 찾을 수도 있습니다. 예를 들어 this one과 같은 일부 SO 질문에서 이에 대한 자세한 정보를 찾아야합니다.

+4

또한 '불가능한'유형을 사용하는 것이 바람직합니다 negativ. – Xeo

+0

Btw, 답변에 부정적인 표현의 정확한 원인을 추가하는 것이 좋습니다. – Xeo

+0

@Xeo 대부분의 전문가에 따르면 아닙니다. 부호없는 (unsigned)은 일반적으로 비트 조작 또는 모듈라 산술 연산이 필요하다는 것을 의미합니다. –

0

최대 32 비트의 데이터를 보유하며 최대 값은 2,147,483,647입니다. 반환 값은 "넘쳐 흐릅니다". 64 비트를 보유하고 최대 값이 18,446,744,073,709,551,615 인 ulong 데이터 유형을 사용하십시오.

1

변수를 unsigned int으로 선언하면 더 많은 상호 작용을 할 수 있지만 문제는 계속 발생합니다. long long int을 사용하여 변수의 크기를 확장해도 문제는 여전히 지연됩니다. 조만간 표현할 수있는 최대 데이터 수를 초과 할 것입니다.

+0

또는 메모리가 부족합니다. BigInt의 일부 구현은 "무한"정밀도를 허용하지만, 결국 "무한"은 사용 가능한 메모리의 양보다 클 수 없습니다. –