그래서 문제는 [1, 10^16] 간격에 두 개의 정수 (a, b)가 있고^b의 숫자가 몇 자리인지 알아 내야한다는 것입니다. 그 수는 단일 변수에 저장하기에는 너무 커서 배열에 쓰면 시간이 많이 걸릴 것입니다.거대한 숫자의 자릿수를 계산하는 방법은 무엇입니까? C++
어떤 종류의 수식이나 더 간단한 방법으로 배열의 수를 계산하는 방법이 있습니까?
그래서 문제는 [1, 10^16] 간격에 두 개의 정수 (a, b)가 있고^b의 숫자가 몇 자리인지 알아 내야한다는 것입니다. 그 수는 단일 변수에 저장하기에는 너무 커서 배열에 쓰면 시간이 많이 걸릴 것입니다.거대한 숫자의 자릿수를 계산하는 방법은 무엇입니까? C++
어떤 종류의 수식이나 더 간단한 방법으로 배열의 수를 계산하는 방법이 있습니까?
karakfa의 자리
번호를 마우스 오른쪽이를 제안했다.
수 n
의 기지 - k
대수가 가장 가까운 정수로 반올림, 당신에게 기본 k
에 n
을 표현하기 위해 필요한 자릿수를 제공 할 것입니다.
편집 : 의견에서 지적한 바와 같이, 반올림하지 말고 반올림 한 다음 하나씩 증가시켜야합니다. 이것은 여분의 숫자가있는 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
과 다른 정수 값을 가지면 메서드가 실패합니다. 이 상태에 가까울 때이를 감지하고 어떻게 든이를 교정 할 수 있습니다.
@GaBoKaS karakfa의 대답에 대한 Slava의 설명을보십시오. 10 승의 동등 함을 설명하기 위해서는'ceiling '대신'floor() + 1'이어야합니다. – Patrick87
BTW, 32 비트 시스템에서는 계산하기 쉽지 않습니다. 따라서 64 비트 시스템이 필요합니다. – KonstantinL
GMP과 같이 임의의 큰 숫자를 지원하는 라이브러리를 사용할 수 있습니다.
코어 C++ 언어 자체는 큰 숫자로 작업 할 수있는 유형을 제공하지 않습니다. 따라서 기존 라이브러리를 사용하거나 직접 작성하십시오 (이전 버전을 제안 - 바퀴를 다시 발명하지 마십시오). 일회성 오류를 수정 한 후
10 개의 대수는 자릿수를 제공합니다. – karakfa
당신은 야구장, 숫자 또는 정확한 숫자로 다소 정확합니까? –
자릿수 만 필요합니다.^b의 실제 결과는 중요하지 않습니다. – GaBoKaS