개발/문제풀이

Code. 프로젝트 오일러. KR 4번. C++

ordi2016. 9. 25. 14:08

프로젝트 오일러 KR 4번.


세자리 수를 곱해 만들 수 있는 가장 큰 대칭수



문제 출처.

http://euler.synap.co.kr/prob_detail.php?id=4



요점.

대칭수(Palindrome) ex)101, 45754, 9005009

하지만 중요한건 3자리 수, 두개를 곱해서 가장 큰 대칭 수를 만들어야 한다는 것이다.




풀이 방법.

<A : 101 ~ 999> * <A ~ 999>를 일단 순차적으로 돌렸다.

두번째 피연산자의 범위가 첫번째 피연사자인 A로 시작하는 이유는

예를들어 101 * 102 = 102 * 101 이기 때문에,

같은 결과를 두번 반복하는 짓을 막기 위해서이다.


그리고 그걸 계산한 수를 어느 곳에 저장(est_num).

그걸 어느 변수(temp)에 저장해 뒤집는다.

뒤집는 수는 rev_num에 저장하고,

rev_num과 est_num이 같다면,

est_num은 대칭수!

이과정을 통해 est_num의 최대값을 찾아내면 된다.

 




코드.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;
 
int main()
{
    const int LIMIT = 999;
    const int TEN = 10;
    int max_palin = 0;
     
    for (int num1 = 100; num1 <= LIMIT; num1++)
        for (int num2 = num1; num2 <= LIMIT; num2++)
        {  
            int est_num = num1 * num2;
            int temp = est_num;
            int rev_num = 0;
             
            // 뒤집는 과정
            while (temp > 0)
            {
                rev_num *= TEN;
                rev_num += temp % TEN;
                temp /= TEN;
            }
             
            // 이 수는 대칭수인가?
            if (rev_num == est_num)
            {
                // 그 중에서도 제일 큰 값이 였는가?
                if (max_palin < rev_num)
                    max_palin = rev_num;
                cout << num1 << '\t' << num2 << '\t' << rev_num << "\t\t" << max_palin << endl;
            }
        }
}




요약.

대칭수라는게 뭔지 알았다.

의미가 같은 과정은 막는게 좋겠지?



댓글

Pmon

뭐든 간에 기록하자

SNS

  • 페이스북아이콘
  • 카카오톡아이콘
  • 트위터아이콘

Lately Post

Lately Comment

VISITED

Today :

Total :