2017-03-15 19 views
3

그래서 문제는 [1, 10^16] 간격에 두 개의 정수 (a, b)가 있고^b의 숫자가 몇 자리인지 알아 내야한다는 것입니다. 그 수는 단일 변수에 저장하기에는 너무 커서 배열에 쓰면 시간이 많이 걸릴 것입니다.거대한 숫자의 자릿수를 계산하는 방법은 무엇입니까? C++

어떤 종류의 수식이나 더 간단한 방법으로 배열의 수를 계산하는 방법이 있습니까?

+0

10 개의 대수는 자릿수를 제공합니다. – karakfa

+0

당신은 야구장, 숫자 또는 정확한 숫자로 다소 정확합니까? –

+0

자릿수 만 필요합니다.^b의 실제 결과는 중요하지 않습니다. – GaBoKaS

답변

1

karakfa의 자리

번호를 마우스 오른쪽이를 제안했다.

n의 기지 - k 대수가 가장 가까운 정수로 반올림, 당신에게 기본 kn을 표현하기 위해 필요한 자릿수를 제공 할 것입니다.

편집 : 의견에서 지적한 바와 같이, 반올림하지 말고 반올림 한 다음 하나씩 증가시켜야합니다. 이것은 여분의 숫자가있는 10의 라운드 력을 설명합니다.

숫자가 a^b 인 경우 기수 10 로그, log a^b을 사용하고 로그 법칙을 사용하여 b log a으로 단순화하십시오. 이 단순화는 ceiling 함수 내에서 발생하므로 단순화가 유효합니다. log a 컴퓨팅은 문제가되지 않아야하며 0 ~ 16 사이의 값을 가지며 b이 알려져 있습니다. 전에 곱해 봤는지 확인하십시오.

부동 소수점의 정밀도가 제한되어 있으면이 메서드에 오류가 발생할 수 있습니다. b x log a의 true 값이 가장 가까운 부동 소수점 표현 인 b x log a과 다른 정수 값을 가지면 메서드가 실패합니다. 이 상태에 가까울 때이를 감지하고 어떻게 든이를 교정 할 수 있습니다.

+1

@GaBoKaS karakfa의 대답에 대한 Slava의 설명을보십시오. 10 승의 동등 함을 설명하기 위해서는'ceiling '대신'floor() + 1'이어야합니다. – Patrick87

+0

BTW, 32 비트 시스템에서는 계산하기 쉽지 않습니다. 따라서 64 비트 시스템이 필요합니다. – KonstantinL

0

GMP과 같이 임의의 큰 숫자를 지원하는 라이브러리를 사용할 수 있습니다.

코어 C++ 언어 자체는 큰 숫자로 작업 할 수있는 유형을 제공하지 않습니다. 따라서 기존 라이브러리를 사용하거나 직접 작성하십시오 (이전 버전을 제안 - 바퀴를 다시 발명하지 마십시오). 일회성 오류를 수정 한 후

+0

실제로 숫자를 메모리에 저장하지 않고 숫자를 계산하는 것이 전부입니다. 심지어 RAM의 100 %를 사용하더라도 쓰기가 가능하지 않을 수도 있습니다. 어쨌든 숫자의 양을 나타내는 숫자를 저장하려면 GMP가 필요할 것입니다. D – Criss

+0

다운로드가 필요없는 다른 방법이 있습니까? :) – GaBoKaS

6

는 의견 a^b = floor(b * log(a)) + 1

+1

나는'floor() + 1'이어야한다고 생각한다. 그렇지 않으면 1 10 100 등등에 대해 잘못된 값을 줄 것이다. – Slava

+0

의 제곱에 대해 값은 정수가 될 것이므로'ceil (n) == n' – karakfa

+0

맞습니다. 그래서 log (1) == 0,'ceil'도 0입니다. 1을 저장하려면 0 자리가 필요합니까? log (10) == 1 – Slava