2011-10-24 4 views
1

나는이 문제가 있습니다. 지정된 양의 정수 K1000000 자릿수 이하인 경우 K보다 큰 최소 회문 값을 출력하십시오. 숫자는 항상 앞에 오는 0없이 표시됩니다. 입력취급 많은 수의

첫 번째 줄에는 테스트 사례의 수인 t이 포함됩니다. 정수 K은 다음 t 행에 있습니다. 출력

K에 대해 K보다 큰 최소 배율을 출력합니다. 예

입력 :

2 
808 
2133 

출력 :

818 
2222 

내 코드 문자열로 변환하고, 입력 문자열 따라서 조정 작업의 양쪽 끝을 평가 내측 이동한다. 그러나 문제는 내가 즉

Integer.parseInt(LARGENUMBER); 

또는

Long.parseInt(LARGENUMBER); 

LARGENUMBER는 숫자 형식 예외를 얻을 많은 수의 구문 분석을 시도하는 경우는, 최대 10^6 자리의 값을 취할 수 있어야 범위를 벗어났습니다. 누구든지 작업을 생각하거나 그러한 큰 숫자를 어떻게 처리 할 수 ​​있습니까?

답변

5

BigInteger 클래스를 사용하면 이와 같은 큰 정수를 처리 할 수 ​​있습니다.

그러나 엄청난 크기에서는 효율적이지 않을 것입니다. 왜냐하면 곱셈과 변환을 위해서 여전히 알고리즘이 O(n^2)이기 때문입니다.

+0

BigInteger는 최대 20 자리 숫자까지만 처리 합니다만 그렇지 않습니까? – Mead3000

+6

@ Mead3000 BigInteger는 (이론적으로) 메모리가 처리 할 수있는만큼 큰 숫자를 처리 할 수 ​​있습니다. – NullUserException

5

지금하는 단계를 생각해보십시오. 번호를 처리하기 위해 숫자를 문자열로 변환하기 때문에 조금 불필요한 것처럼 보입니까?

+0

그의 알고리즘은 어쨌든 숫자 연산을 사용하지 않아도 될 것입니다 ... – hugomg

+0

그게 핵심입니다. :) –

+0

당신은 spoj.pl에 대해 들어 본 적이 없지만 문제는 거기에서 ... 그것은 내 컴퓨터에서 잘 실행되지만 사이트에 제출하면 시간 제한을 초과합니다. 그래서 모든 변환이이 알고리즘에서 시간의 복잡성을 내 알고리즘에 제공한다고 가정합니다. 의견이 있으십니까? – Mead3000

2

이 문제는 정수에 대해 말하지만 입력 및 출력 문자와 형식을 제한하기 위해서만 사용됩니다. 이것은 신중한 선택을하는 실제 문자열 조작 문제입니다. 이 경우 실제로 입력을 문자열로만 읽을 필요가 없습니다.

이렇게하면 palindrome을 간단하게 확인할 수 있습니다. 해결해야 할 유일한 것은 다음으로 높은 것을 선택하는 것입니다.

+0

수정해야 할 문자열의 부분을 좁힐 수 있습니다. 어떤 부분이 이미 palindrome인지 파악하고 나머지 부분을 제거한 다음 숫자로 변환하고 산술을 수행 한 다음 문자열 바꾸기를 수행 할 수 있습니다. 아마. 그냥 제안. – allingeek

+0

하지만 모든 숫자를 변경해야하는 경우 (예 : 899999999 ---> 900000009) 숫자의 값을 전체적으로 고려해야합니다. 또는 나는 여기에서 트릭을 놓치고있다 – Mead3000

+0

환호, 나는 그것을 고쳤다. – Mead3000