2013-06-07 5 views
0

큰 수의 곱셈에 GNU 및 기타 라이브러리가 필요한 방법에 대해 여러 주제를 읽었지 만, 대형 외부 라이브러리를 사용하십시오. 따라서 큰 숫자를 문자열로 입력하는 방법을 생각해 보았습니다. 원하는 숫자를 수행 할 수 있었지만 이제는 50 자리까지 두 정수를 곱하기가 어려웠습니다. 내 코드에서 구현할 수있는 200 줄 이하의 코드를 찾을 수 있으며이를 수행 할 수있는 코드가 있습니까? 아니면이 숫자를 분할하여이 곱셈을 구현하는 쉬운 방법이 있습니까? 어떤 생각이나 도움이 크게 감사하겠습니다.외부 라이브러리를 사용하지 않고 문자열에 커다란 큰 정수가 곱셈 됨 C++

답변

1

과거에이 작업을 수행 한 방법은 임의로 크기가 지정된 숫자에 대한 정수 배열을 만드는 것입니다. 50 진수는 약 167 비트 또는 20 바이트를 약간 넘는다. 최대 24 개의 라운드로 32 비트 정수 배열에 적합합니다. 그런 다음 십진수 문자열을 24 비트 정수 a와 b로 변환하십시오. 거기에서, 당신은 효과적으로 곱셈을 당신이 손으로 그것을하기 위해 배웠던 것과 같은 방식으로 할 수 있습니다. 이미이 번호를 추가하는 기능을 가지고 가정, 당신이 그렇게처럼 곱 수 있습니다

int32_t a[6]; 
int32_t b[6]; 

// multiplication results require twice as much space as the operands 
int32_t result[12]; 
memset(&result, 0, sizeof(12)); 

int32_t temp_result[6][7]; 
for (int i = 0; i < 6; i++) 
{ 
    for (int j = 0; j < 6; j++) 
    { 
     int64_t product = a[i] * b[j]; 
     temp_result[i][j] = product & (0xffffffff); 
     temp_result[i][j + 1] = product & (0xffffffff00000000); 
    } 
} 

for (int i = 0; i < 6; i++) 
{ 
    // source a,  source b, result 
    add(temp_result[i], result[i], result[i]); 
} 

을 이미 추가 기능이없는 경우, 과정은 매우 유사하다.

+1

int는 32 비트라고 가정 할 수 없습니다. 나는 uint32_t – camelccc

+0

@ camelccc를 사용할 것입니다. 좋은 지적입니다. 코드가 수정되었습니다. –

0

mini-gmp (작은 단일 .c 및 .h 파일, 전체 gmp 패키지의 일부).

부팅 다중 정밀도 (너무 작지 만 헤더 전용).

+0

좀 더 자세히 설명해 주시겠습니까? – chrislondon