2016-07-11 6 views
-5

저는 64 비트 운영 체제를 사용하고 있으며, 또한 40 번째 피보나치 수를 정확하게 인쇄 할 수 없습니다. 정확히 40 억 미만입니다.47 번째 피보나치 번호를 올바르게 인쇄 할 수없는 이유는 무엇입니까?

#include<cs50.h> 
#include<stdio.h> 

int main(void) 
{ 

    unsigned int n=50; 
    int array[n]; 
    array[0]=0; 
    array[1]=1; 
    printf("%i\n",array[0]); 
    printf("%i\n",array[1]); 
    for(int i=2;i<n;i++) 
    { 
     array[i]=array[i-1]+array[i-2]; 
     printf("%i\n",array[i]); 
    } 
+0

를' int array [n]; printf ("% i \ n", array [i]);'->'부호없는 int 배열 [n]; – kaylum

+0

@kaylum unsigned int는 여전히 49 번째 요소에서 범위를 벗어납니다. printf ("% u \ n", array [i]); –

+0

@RishikeshRaje 네, "47 번째로 인쇄 할 수없는 이유는 무엇입니까?" 변경하면 47 번째가 올바르게 인쇄됩니다. 그리고 OP는 구체적으로 OP가 32 비트 숫자의 범위에 대해 알고 있다는 것을 의미하는 것으로 보이는 "40 억"을 언급 했으므로 이전에는 그렇지 않았지만 번호를 초과하면 넘침을 볼 수 있습니다. – kaylum

답변

2

배열의 데이터 유형으로 길게 사용해야합니다. 왜냐하면 정수 범위의 범위를 벗어나는 숫자를 저장하려고하기 때문입니다. (- 2,147,483,648에서 2,147,483,647까지) int의 선언은 for 루프 앞에 있어야합니다.

#include<stdio.h> 

int main(void) 
{ 

    int n=50; 
    long long array[n]; 
    array[0]=0; 
    array[1]=1; 
    printf("%lli\n",array[0]); 
    printf("%lli\n",array[1]); 
    int i; 
    for(i=2;i<n;i++) 
    { 
     array[i]=array[i-1]+array[i-2]; 
     printf("%lli\n",array[i]); 
    } 
} 
+1

"int의 선언은 for 루프 앞에 있어야합니다." -> C99 이후'for (int i = 2; i chux

+1

예. 당신이 올바른지. 감사. 나는 고칠 것이다. –

2

내가 미만 40 억이다 정확하게 46 번째 피보나치 수를 인쇄 할 수 없습니다입니다.

당신은 아마 -4294967296에서 4294967295

변경 int array[n]; 또한

long long array[n];에에 정수의 범위를 벗어나려고하고있다는의 printf의는 %lli

%i에서 변경해야

편집 : 숫자를 실행할 때 F (48)의 예상 값이 정수 범위를 벗어나는 4807526976이됩니다.

+1

부호있는 32 비트 숫자의 범위는 2147483648에서 2147483647까지입니다. – user3386109

1

Fish (48)가 4807526976 인 Rishikesh Raje의 계수 시스템을 사용하면 (F) 첫 번째 Fibonacci가 1 일 때 F (47) 2971215073을 얻을 수 없습니다. @kaylum이 주석 처리했기 때문에 부호있는 정수 배열 서명되지 않은 값으로 변경해야하는 값을 저장하고, printf 문을 변경하여 서명되지 않은 값을 인쇄합니다. Rishikesh에 Raje에서 알 수 있듯이, 당신은 오래, 또는 긴 정수 (Long)로 전환 할 수 있습니다

#include <stdio.h> 

#define LIMIT (50) 

int main(void) { 
    unsigned int array[LIMIT] = {0, 1}; 

    printf("%u\n", array[0]); 
    printf("%u\n", array[1]); 

    for (size_t i = 2; i < LIMIT; i++) 
    { 
     array[i] = array[i - 1] + array[i - 2]; 
     printf("%u\n", array[i]); 
    } 

    return 0; 
} 

32 비트 이상의 얻으려면, 그러나 당신이 도달하고자하는 경우 서명되지 않은 변종 작업이는 32 비트 연산의 한계에 도달 할 수 있도록 할 지정된 비트 수로 최대 결과를 얻을 수 있습니다.

0

하나를 사용 부호없는 정수 배열 이상의 높은 값이 부호 오래 오래 오래 배열을 사용하지만 당신은 당신이 단순히이 작업을 수행 할 수 있습니다 피보나치 시리즈 인쇄 배열이 필요하지 않습니다에 대한 : -

void main() 
{ 
    unsigned long long i=1, num1=1, num2=0; 
    printf("1 \n"); 
    for(i; i<100 ; i++) 
    { 
    num1=num1+num2; 
    num2=num1-num2; 
    printf("%lli \n", num1); 
    } 
    getch(); 
}