2016-11-11 1 views
-1

내가 그런거대한 수를 인쇄하는 방법은 무엇입니까?

 0 1 1 2 3 5 8 21 .... 

마지막 번호로, 피보나치 숫자를 출력하는 프로그램을 작성하는 시도하고 앞의 두의 합계입니다.

나는 그것을 쉽게 생각하지만 (지금까지 초과, 단지 그들을 검사)는

C의 숫자의 가능한 모든 종류의 크기를 초과
117669030460994 

같은 거대한 숫자를 인쇄해야 깨달았다.

이렇게 큰 번호를 어떻게 저장하고 인쇄 할 수 있습니까?

+2

큰 프린터를 사용 하시겠습니까? –

+1

'unsigned long long'을 초과하지 않아야하며'18446744073709551615 '까지 허용됩니다. –

+2

다음을보십시오 : https://gmplib.org/ –

답변

0

arbitrary precision arithmetic 별칭으로 bignums입니다 :이처럼 보이는 것입니다

. 저기, 특히 GMPlib에 대한 몇 가지 라이브러리가 있습니다. 숫자의 수천 (또는 수백만)의 큰 Fibionacci 수치를 계산할 수 있습니다.

bignum 산술을 효율적으로 구현하기가 어렵다는 점을 알아 두십시오. 따라서 바퀴를 재발 명하지 마십시오. 당신이 생각하는 몇 가지 간단한 알고리즘은 최첨단 기술보다 효율적이지 않습니다. 기존 라이브러리를 사용하십시오 (종종 을 과 같이 추가하고 carry with the operation을 수행하는).

1

피보나치 시퀀스에 대해 unsigned long long 개의 정수를 처리했던 비슷한 프로그램을 작성했습니다. 숫자를 저장하기 위해 배열을 사용했기 때문에 그것이 얼마나 효율적인지 모르겠습니다.

Windows를 사용했기 때문에 큰 64 bit 정수를 인쇄하는데도 %I64d 형식 지정자를 사용했습니다. 하지만 당신의 리눅스를 사용하는 경우 %llu 괜찮다고 생각합니다.

@M Oehm이 의견에서 지적한대로 uint64_t을 사용하는 것도 unsigned long long을 선언하는 또 다른 방법입니다.

당신이 원하는 무엇
#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

#define MAX 100 

int 
main(void) { 
    int i, range; 

    unsigned long long array[MAX]; 
    /* or uint64_t from <stdint.h> */ 

    printf("Enter number range: "); 
    if (scanf("%d", &range) != 1) { 
     printf("invalid number\n"); 
     exit(EXIT_FAILURE); 
    } 

    array[0] = 0; 
    array[1] = 1; 

    for (i = 2; i < range; i++) { 
     array[i] = array[i-1] + array[i-2]; 
    } 

    printf("Fibonacci Series is: "); 
    for (i = 0; i < range; i++) { 
     printf("%I64d ", array[i]); 
    } 

    return 0; 
} 
+1

그건'% 11u' (eleven) 대신'% llu' (ell-ell)이어야합니다, 그렇지 않습니까? 그것이 가치있는 것을 위해, 표준 헤더''은 정수형'uint64_t'를 정의하고''은 인쇄 매크로'PRIu64'를 정의합니다. –

+0

그래, 나쁘다. 나는 그것을 바꿀 것이다. 감사. – RoadRunner

+1

니스, 괜찮 았어. print 문을 "printf ("% llu ", array [i]);"로 변경했습니다. 다음 94 번째 번호까지 올바르게 인쇄됩니다. 95 번째 숫자부터 모두 잘못되었습니다. 그것은 충분히 크다. 감사 :) – arslan

관련 문제