## 문제 ##
앞에서부터 읽을 때나 뒤에서부터 읽을 때나 모양이 같은 수를 대칭수(palindrome)라고 부릅니다.
두 자리 수를 곱해 만들 수 있는 대칭수 중 가장 큰 수는 9009 (= 91 × 99) 입니다.
세 자리 수를 곱해 만들 수 있는 가장 큰 대칭수는 얼마입니까?
(출처: https://projecteuler.net )
## 풀이 ##
## 소스코드 ##
package p1;
public class PalindromeNumber {
public PalindromeNumber(){
test();
}
private void test(){
long p=0,q=0,n=0;
long r_p=0,r_q=0,r_n=0;
for(p=999;p>=100;p--){
for(q=999;q>=100;q--){
n = p * q;
if(isPalindrome(n)){
if(n>r_n){
r_n=n; r_p=p; r_q=q;
}
if(n>=90000 && n<=99999){
System.out.println("n:"+n+" p:"+p+" q:"+ q);
}
}
}
}
System.out.println("n:"+r_n+" p:"+r_p+" q:"+ r_q);
}
private boolean isPalindrome(long a){
if(a < 0) return false;
if(a == 0) return false;
int n = (int)Math.log10(a); //자릿수. ex)a=1001 -> n=3
if(n==0) return true; //1자리숫자
//변환 to 각자리를 나타내는 10진수 배열
int[] arr = new int[n+1];
long d,t;
for(int i=n;i>=0;i--){
d = (long)Math.pow(10, n-i);
arr[i] =(int)((int)(a/d)%10); //각자리의 10진수 값
}
//배열의 절반을 나눠서 같은지 비교
int half = (n+1)/2; //4->2 5->2 6->3
for(int i=0;i<half;i++){
if(arr[i] != arr[n-i]){
return false;
}
}
return true;
}
public static void main(String[] args) {
new PalindromeNumber();
}
}
-끝-
'알고리즘 > 알고리즘(Java)' 카테고리의 다른 글
12. [수치] 진수 변환 (0) | 2015.04.02 |
---|---|
10. 1초에 한칸씩 격자를 움직이는 개미의 n초후 좌표 찾기 (0) | 2015.03.30 |
05. 거스름돈 계산 문제 (0) | 2015.03.30 |
04. 타일 채우기 가능여부 판단 알고리즘 (0) | 2015.03.30 |
03. 게시판 포스트 중첩부분 면적 구하기 (0) | 2015.03.27 |