2009-09-26 4 views

답변

6

어떻게 변수에 2^32-1보다 큰 수가 포함되어 있습니까? 짧은 대답 : 아마도 특정 데이터 구조와 다양한 기능 (오, 클래스?)을 처리 할 것입니다.

이 데이터 구조가 주어지면 어떻게 인쇄합니까? BigInteger_Print(BigInteger*) 물론 :

실제로 2^32-1보다 큰 숫자 인쇄는 전적으로 해당 번호를 저장하는 방법에 따라 달라 지므로이 문제에 대한 정답은 없습니다. 당신에 대한 INT64 유형을 이야기하는 경우

1

, 당신은 % I64u % I64d, % I64x %의 LLU %의 LLD 일반적인 하드웨어에

+0

-1, 약 200 비트는? – hasen

+1

@hasen j : 젠체하는 사람! -1 정말요? 네, 약 200 비트, 어떻게 도대체 64 정보를 유해하거나 부정확하게 제공하고 있습니까? – JustJeff

1

, 가장 큰 float이 시도 할 수 있습니다 (2^128-2^104) , 그것보다 작은 경우 printf()에 %f (또는 %g 또는)을 사용하면됩니다.

int64 유형의 경우 JustJeff의 답변이 주목됩니다.

double (%f)의 범위는 거의 2^1024까지 확장되며, 이는 실제로 매우 큽니다. 인텔 하드웨어에서 long double (%Lf) 유형이 80 비트 부동 소수점에 해당하는 경우 해당 유형의 범위는 최대 2^16384가됩니다.

보다 큰 숫자가 필요한 경우 라이브러리 (자체 인쇄 루틴이있을 수 있음)를 사용하거나 자신의 표현을 굴려 자신의 인쇄 지원을 제공해야합니다.

+1

'long' (최소 32 바이트는 보장되지만 _can_는 길어질 수 있음)과'long long' (적어도 64 비트가 보장됨)을 잊지 맙시다. –

+0

float에는 약 7 자리의 십진수 정밀도, 약 15 배의 double 정밀도, 약 20 배 정도의 long double 만 있다는 사실도 잊지 마십시오. – greyfade

+0

-1. 나는이 질문이 32 비트 정도는 아니라고 생각한다; 일반적으로 하드웨어 유형에 맞지 않는 큰 숫자입니다. – hasen

2

더 많은 이론적으로 : 어딘지에 매우 매우 큰 숫자가 저장되어 있다고 가정 해보십시오. 그렇다면, 당신은 어떻게해서든지 그 수에 수학을 할 수 있다고 생각합니다. 그렇지 않으면 그것을 저장하는 것이 무의미 할 것입니다.

수학을 할 수 있다면, 십진수 (10)로 나누면됩니다. 나머지는 어딘가에 저장하십시오. 결과가 10보다 작을 때까지 반복하십시오. 10보다 작 으면 인쇄 한 다음 마지막부터 첫 번째까지 나머지를 인쇄하십시오. 끝.

노력없이 인쇄 할 수있는 최대 10의 힘 (32 비트, 1'000'000'000)으로 나누어 속도를 높일 수 있습니다.

편집 : 의사 코드 :

#include <stdio.h> 
#include <math.h> 
#include <math_with_very_very_big_num.h> 

int main(int argc, char **argv) { 
    very_very_big_num bignum = someveryverybignum; 
    very_very_big_num quot; 
    int size = (int) floor(vvbn_log10(bignum)) + 1; 
    char *result = calloc(size, sizeof(char)); 

    int i = 0; 
    do { 
    quot = vvbn_divide(bignum, 10); 
    result[i++] = (char) vvbn_remainder(bignum, 10) + '0'; 
    bignum = quot; 
    } while (vvbn_greater(bignum, 9)); 
    result[i] = (char) vvbn_to_i(bignum) + '0'; 
    while(i >= 0) 
    printf("%c", result[i--]); 
    printf("\n"); 
} 

(나는 veryverybignum 물건으로 번역보다 오래 사용하여이 쓴, 그것은 불행하게도 내가 그래서 만약 용서해주십시오,이 버전을 시도 할 수없는, 오래 함께 일 변환 오류 ...)

+0

몇 가지 간단한 의사 코드는이 대답을 훌륭하게 만들지 만 어쨌든 +1 할 것이다. –

+0

@Chris : 당신 말이 맞아요. 결정된. – giorgian

관련 문제