필자는 경쟁 프로그래밍 클래스의 숙제를위한 프로그램을 작성 중이며 한 가지 문제를 해결할 수 없습니다. 이 문제는 특정 조건에 따라 특정 문자열의 모든 순열을 계산해야하며 내 프로그램에서이를 수행해야합니다. 그러나 문제는 입력이 매우 큰 문자열 인 경우 최대 10^6까지 가능합니다.자바에서 엄청나게 많은 수를 어떻게 처리 할 수 있습니까?
문제는 2^결과입니다. 결과는 입력 문자열의 길이에 따라 달라 지므로 10^6의 경우 최대 5 * 10^5가 될 수 있습니다. 해결책은 result % (10^9 + 7) 형식이어야합니다.
솔루션을 BigInteger에 넣으려고했지만 힙 공간이 부족합니다. 복식으로 작업 해봤는데 오버플로가 있습니다. 내가 누락 된 것이 있거나이를 처리 할 수있는 방법이 있습니까? 고맙습니다.
System.out.println((int) (Math.pow(2, counter) % (1e9 + 7)));
//it prints out 0, probably due to overflow?
DecimalFormat df = new DecimalFormat("#");
System.out.println(df.format(Math.pow(2, counter) % (1e9 + 7)));
//prints out �
가 (당신이 [BigDecimal를] 바라 보았다 유무 : 여기
반복 제곱를 통해 지수화 한 후 나머지 부분에 대한 위키 백과의 의사 코드이다 /math/BigDecimal.html)? – DaoWenBigInteger를 시도했지만 힙 공간이 부족합니다. BigDecimal을 시도하지 않았으니, 지금 시도해보십시오, 감사합니다. – leonz
숙제는 [모듈러 지수 계산] (https://en.wikipedia.org/wiki/Modular_exponentiation)을 구현하는 것입니다. BigInteger는 이미 [modPow] (https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html#modPow (java.math.BigInteger, % 20java.math.BigInteger))로 구현합니다.). 지수를 완전히 계산하지 말고 나머지를 가져 가야합니다. –