본문 바로가기
반응형

Programming/Project Euler89

38. 프로젝트 오일러 #38 : 팬디지털 곱하기 난이도 5%에 해당하는 문제입니다. 이번 문제는 1부터 9까지의 숫자를 한번씩만 사용하는 문제입니다. 192라는 숫자를 예를 들자면, 192x1 = 192192x2 = 384192x3 = 576 이 되어서, 곱하기 결과 192, 384, 576의 숫자들을 합치면, 1부터 9까지 오직 한번씩만 사용된 팬디지털을 이룹니다. 이와 같은 숫자를 찾는 것이 이번 문제입니다. 최대값을 찾으라는 것이기 때문에, 4자리 숫자부터 차례대로 찾아서 x2 한 값과 원래의 값이 팬디지털을 이루는지만 검사하면 됩니다. 프로그램은 간단합니다. bool IsPandigitalMultiply(int n) { unsigned short s = 0; for( int i = 1 ; ; i++ ) { int t = n*i; while( t.. 2015. 4. 20.
37. 프로젝트 오일러 : 잘라도 소수가 되는 소수 난이도는 5%로 낮은 난이도의 문제입니다. 이 문제는 앞을 잘라도 소수가 되는 소수를 찾아야 합니다. 예를 들면 3797은 자체로 소수이지만, 797, 97, 7 도 소수이며, 반대로 379, 37, 3도 소수가 됩니다. 원래라면, 모든 소수를 다 찾고, 모든 소수에 대해서 잘라가면서 소수인지 검사하면 되는 간단한 프로그램이 됩니다. 소수를 검사하기 위해서 소수를 다 찾고, 이진 검색을 이용해서 소수인지 검사하면 편하지만, 제가 중점을 둔 것은 이러한 소수의 성질이었습니다. 두자릿수 이상의 수중, 마지막 자리가 5라면 그 수는 반드시 5로 나누어지기 때문에 소수가 될 수 없습니다. 또한 첫 숫자가 9이거나 마지막 숫자가 9라면, 잘라내기에 의해서 9가 남기때문에 첫 숫자와 마지막 숫자는 9가 될 수 없습.. 2015. 4. 18.
36. 프로젝트 오일러 #36 : 두개의 진법에서 대칭수 대칭수인지 결정하는 방법과 대칭수를 만드는 것은 여러가지 방법이 있을 수 있습니다.이번 문제는 십진수에서 대칭수이면서 이진수에서 대칭수인 수를 찾아서 그 합을 구해야 하죠. 난이도 5%짜리 문제입니다. (그만큼 어렵지 않다는 것이겠죠.) 사실 십진수 대칭수를 만드는 여러가지 방법이 있겠지만, 저는 약간 복잡하게 대칭수를 만들었습니다. 속도를 빠르게 하기 위한 목적이 있었죠. 13 이라는 숫자가 있다면, 이에 대한 대칭수는 3113, 31013 두가지를 생성해보는 것이죠. 이를 위해서 13이란 숫자에 대한 대칭수인 31을 생성합니다. 그리고 나서 31x100+13 과 31x1000+13 을 이용해서 대칭수를 만듭니다. 이런식으로 1백만 이하의 모든 대칭수를 생성하죠. 사실 for 루프를 이용해서 1~1백만.. 2015. 4. 16.
35. 프로젝트 오일러 #35 : 순환하는 소수들 197과 같은 소수는 한자리씩 순환하여도, 계속 소수가 됩니다. 197도 소수이지만, 971, 719도 소수가 되는 것이죠. 이 문제는 이러한 소수들을 찾는 것인데, 결국 한계값까지 소수들을 구한 후, 자릿수 순환해서 소수인지 검사하면 됩니다. 그래서인지 난이도도 5%네요. 프로그램은 아주 간단합니다. 한계값까지 모든 소수를 구한 후에 각각의 소수들에 대해서 순환 여부를 판단하면 됩니다. 뭐 그냥 짜도 되겠지만, 제 경우에는 배열에 소수값을 넣지 않고 플래그처럼 사용해서 프로그램을 짰습니다. 2는 예외이고요. 어차피 유일한 짝수 소수이니까요. 예외 처리를 해도 무방합니다. 그리고 모든 자릿수가 홀수여야 하겠죠. 2를 제외하고는 짝수가 들어가서는 절대 순환하는 수들이 소수가 될 수 없으니까요. 제가 작성한.. 2015. 4. 15.
34. 프로젝트 오일러 #34 : 자릿수의 팩토리얼 합 연달아서 난이도 5% 정도의 문제네요. 이번 문제는 각각의 자릿수의 팩토리얼 합이 자신이 되는 숫자를 찾는 것입니다. 예를 들어서 145란 숫자는, 가 됩니다. 이번 문제는 이와 비슷한 숫자들의 합을 구하는 것입니다. 이제 프로젝트 오일러를 이정도까지 진행하셨다면, 십진수의 자릿수를 빼는 것에는 다들 어느정도 경험이 있을 것이라 생각합니다. 제 경우에는 각 자릿수의 팩토리얼 값을 미리 저장해서 사용했습니다. 9! = 362880 이므로, 대충 6자릿수자일거라고 생각하면 됩니다. 그래서 숫자범위를 그렇게 정했습니다. 제가 작성한 프로그램은 다음과 같습니다. #include int main() { int facts[10] = { 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 36280.. 2015. 4. 13.
프로젝트 오일러 #33 : 약분하는 추가 숫자 #33의 난이도는 5%네요. 쉬운 등급으로 설정된 문제입니다. 이 문제는 분자와 분모에 같은 숫자를 추가하면, 약분이 되고, 약분된 결과가 원래 분수와 같으면 됩니다. a/b 꼴의 분수에서는 분자 분모 양쪽 모두 뒤에 0을 추가하면 당연히 같은 값이 되겠죠. 이것은 당연한 해이므로 제해야 합니다. 그러려면, 분자에는 뒤에, 분모에는 앞에 어떤 숫자를 넣어주어야 합니다. a/b 라는 분수에 분자에는 앞에 분모에는 뒤에 숫자 x를 넣어준다면, 그 반대라면, 형태가 될겁니다. 결과는 비례식을 이용해서 단순하게 곱하면 나오므로, 푸는데에는 별 지장이 없을겁니다. 2015. 4. 13.
728x90