[Project Euler #14][C++] 백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은?
Problem Solving/Project Euler 2020. 12. 28. 00:36728x90
728x170
문제14 : 백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은?
문제
양의 정수 n에 대하여, 다음과 같은 계산 과정을 반복하기로 합니다.
n → n / 2 (n이 짝수일 때)
n → 3n + 1 (n이 홀수일 때)
13에 대하여 위의 규칙을 적용해보면 아래처럼 10번의 과정을 통해 1이 됩니다.
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
아직 증명은 되지 않았지만, 이런 과정을 거치면 어떤 수로 시작해도 마지막에는 1로 끝나리라 생각됩니다.
(역주: 이것은 콜라츠 추측(Collatz Conjecture)이라고 하며, 이런 수들을 우박수(Hailstone Sequence)라 부르기도 합니다)
그러면, 백만(1,000,000) 이하의 수로 시작했을 때 1까지 도달하는데 가장 긴 과정을 거치는 수는 얼마입니까?
참고: 계산 과정에는 백만을 넘어가는 수가 나와도 괜찮습니다.
문제 해결 방법
- 하나하나씩 계산하는 방식(브루트 포스 방식)으로 문제를 해결하였다.
long long
자료형으로 변수를 선언하지 않을 경우113383
에서 멈추므로 반드시long long
자료형으로 변수를 선언해줘야 했다.- 과정을 알아보기 위해 중간에 출력 함수 를 넣으면 결과값을 얻는데 오랜 시간이 걸린다.
소스 코드
정답
837799 |
심화 공부
콜라츠 추측(Collatz Conjecture)
1937년에 처음으로 이 추측을 제기한 로타르 콜라츠 의 이름을 딴 것으로 3n+1 추측, 울람 추측, 혹은 헤일스톤(우박) 수열 등 여러 이름으로 불린다. 콜라츠 추측은 임의의 자연수가 다음 조작을 거쳐 항상 1이 된다는 추측이다.
1. 짝수라면 2로 나눈다.
2. 홀수라면 3을 곱하고 1을 더한다.
3. 1이면 조작을 멈추고, 1이 아니면 첫 번째 단계로 돌아간다.
예를 들어, 6 에서 시작한다면, 차례로 6, 3, 10, 5, 16, 8, 4, 2, 1 이 된다. 또, 27에서 시작하면 무려 111번을 거쳐야 1이 된다. 77번째에 이르면 9232를 정점으로 도달하다가 급격히 감소하여 34단계를 더 지나면 1이 된다.
이 추측은 컴퓨터로 268까지 모두 성립함이 확인되었다. 그러나, 아직 모든 자연수에 대한 증명은 발견되지 않고 있다. 이 문제의 해결에 500달러의 현상금을 걸었던 에르되시 팔 은 "수학은 아직 이런 문제를 다룰 준비가 되어 있지 않다."는 말을 남겼다.
728x90
그리드형(광고전용)
'Problem Solving > Project Euler' 카테고리의 다른 글
[Project Euler #17][C++] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? (0) | 2021.01.04 |
---|---|
[Project Euler #16][C++] $2^{1000}$ 의 각 자릿수를 모두 더하면? (0) | 2020.12.31 |
[Project Euler #15][C++] 20×20 격자의 좌상단에서 우하단으로 가는 경로의 수 (0) | 2020.12.28 |
[Project Euler #13][C++] 50자리 수 100개를 더한 값의 첫 10자리 구하기 (0) | 2020.12.27 |
[Project Euler #12][C++] 500개 이상의 약수를 갖는 가장 작은 삼각수는? (0) | 2020.12.26 |
[Project Euler #11][C++] 20×20 격자에서 연속된 네 수의 곱 중 최댓값 (0) | 2020.12.26 |
[Project Euler #10][C++]이백만 이하 소수의 합 (0) | 2020.12.24 |
[Project Euler #9][C++] a + b + c = 1000 이 되는 피타고라스 수 (0) | 2020.12.23 |