본문 바로가기

Programming/Project Euler118

[C/C++] 프로젝트 오일러 #39 : 길이가 정수인 직각삼각형 프로젝트 오일러 #39는 난이도 5% 문제로 어렵지 않은 문제입니다.  제목에서 알 수 있듯이 피타고라스 삼각형 문제입니다. 직각삼각형의 길이가 정수로 나오는 것을 피타고라스 삼각형이라고 하는데요.  피타고라스 삼각형은 이미 공식화되어서 잘 나와 있습니다. 일단 피타고라스 삼각형의 원시근에 대해서 알아야 합니다.  세변의 길이를 a, b, c 라 하고, 직각의 대변의 길이를 c 라고 한다면, 우리가 잘 알고 있는 피타고라스 법칙이 나옵니다. \[ a^2 + b^2 = c^2 \] 위 식을 만족하는 정수로 된 순서쌍 \( (x, y, z) \)가 있다면, 어떤 상수 c에 대해서 \( (cx, cy, cz) \)도 피타고라스 법칙을 만족하게 됩니다.   피타고라스 삼각형의 원시근은 순서쌍이 서로 소인 수를 .. 2015. 4. 20.
[C/C++] 프로젝트 오일러 #38 : 팬디지털 곱하기 Project Euler 문제 38번에서는 “팬디지털 수”와 “곱셈 연산”의 개념을 활용하여 특정 조건을 만족하는 가장 큰 수를 찾는 것이 목표입니다. 팬디지털 수란 각 숫자가 1부터 9까지 한 번씩만 등장하는 수를 의미합니다. 예를 들어, 192384576은 1부터 9까지의 숫자가 모두 포함되어 있으므로 팬디지털 수라고 할 수 있습니다. 문제에서는 특정 정수 n 과 정수 k 를 선택하여, \( n \times 1 \), \( n \times 2 \), \( n \times 3 \), …, \( n \times k \)로 만들어진 수를 이어붙였을 때 팬디지털 수가 되는지를 확인하도록 요구하고 있습니다. 또한, 이 과정에서 만들어질 수 있는 가장 큰 팬디지털 수를 구하는 것이 목표입니다. 예를 들어, n .. 2015. 4. 20.
[C/C++] 프로젝트 오일러 #37 잘라도 소수가 되는 소수 Truncatable Prime은 소수 중에서도 매우 특별한 성질을 가진 숫자입니다. 이 숫자는 왼쪽에서부터 자릿수를 하나씩 제거하거나, 오른쪽에서부터 자릿수를 하나씩 제거했을 때 남는 모든 숫자가 여전히 소수로 유지되는 특성을 가집니다. 예를 들어, 일반적인 소수는 1과 자기 자신으로만 나누어떨어지지만, Truncatable Prime은 단순히 소수일 뿐만 아니라, 자릿수를 제거한 모든 숫자 또한 소수라는 추가적인 조건을 만족해야 합니다. 이러한 점에서 Truncatable Prime은 일반적인 소수보다 훨씬 희소하고 독특한 성격을 띠게 됩니다. 예를 들어, 숫자 3797은 Truncatable Prime의 좋은 사례입니다. 이 숫자를 왼쪽에서부터 하나씩 자르면 379, 37, 3이 되며, 오른쪽에서부.. 2015. 4. 18.
[C/C++] 프로젝트 오일러 #36 : 두개의 진법에서 대칭수 프로젝트 오일러 문제 #36 - “Double-base Palindromes”는 10진수와 2진수로 표현했을 때 모두 회문인 숫자를 찾는 문제입니다. 예를 들어, 585는 10진수로도 대칭수(585)이고 2진수로 변환했을 때도 대칭수(1001001)입니다. 이런 숫자들을 찾아 합계를 계산하고 그 결과를 출력하는 것이 문제에서 요구하는 바입니다. 대칭수인지 결정하는 방법과 대칭수를 만드는 것은 여러가지 방법이 있을 수 있습니다.이번 문제는 십진수에서 대칭수이면서 이진수에서 대칭수인 수를 찾아서 그 합을 구해야 하죠.  난이도 5%짜리 문제입니다.  (그만큼 어렵지 않다는 것이겠죠.) 사실 십진수 대칭수를 만드는 여러가지 방법이 있겠지만, 저는 약간 복잡하게 대칭수를 만들었습니다.  속도를 빠르게 하기 위한.. 2015. 4. 16.
[C/C++] 프로젝트 오일러 #35 : 순환하는 소수들 Project Euler의 35번 문제에서는 “회전 소수(Circular prime)”에 대해 다룹니다. 회전 소수란 어떤 수의 자릿수를 순환하여 만들 수 있는 모든 수가 소수인 경우를 말합니다. 예를 들어 197을 살펴보면, 자릿수를 순환하여 만들 수 있는 197, 971, 719 세 수가 모두 소수이므로 197은 회전 소수에 해당합니다. 문제에서는 이렇게 정의된 회전 소수 중에서 1,000,000(백만) 미만인 것의 개수가 몇 개인지를 구하는지를 묻습니다. 참고로 100 미만의 범위에서는 총 13개의 회전 소수가 존재합니다. 그렇다면 1,000,000 미만 범위에서의 회전 소수는 모두 몇 개인지 구해야 합니다.197과 같은 소수는 한자리씩 순환하여도, 계속 소수가 됩니다.  197도 소수이지만, 97.. 2015. 4. 15.
[C/C++] 프로젝트 오일러 #34 : 자릿수의 팩토리얼 합(구현) 이번 문제는 각각의 자릿수의 팩토리얼 합이 자신이 되는 숫자를 찾는 것입니다. 예를 들어서 145란 숫자는, \[1! + 4! + 5! = 1 + 24 + 120 = 145\] 가 됩니다.  이번 문제는 이와 비슷한 숫자들의 합을 구하는 것입니다. 이제 프로젝트 오일러를 이정도까지 진행하셨다면, 십진수의 자릿수를 빼는 것에는 다들 어느정도 경험이 있을 것이라 생각합니다. 제 경우에는 각 자릿수의 팩토리얼 값을 미리 저장해서 사용했습니다.9! = 362880 이므로, 대충 6자릿수자일거라고 생각하면 됩니다.  그래서 숫자범위를 그렇게 정했습니다.  제가 작성한 프로그램은 다음과 같습니다.//------------------------------------------------// Project Eul.. 2015. 4. 13.