본문 바로가기
반응형

프로젝트 오일러69

프로젝트 오일러 #61 순환하는 n각수 이 문제는 60번에 이어서 연속으로 난이도 20% 문제이지만, 제 경우에는 그렇게 어렵지 않게 풀었던 문제입니다. n각수 문제를 풀기 위해서는 n각수인 조건을 잘 검사하면 큰 무리가 없을 것이라 생각합니다. 이 문제는 두자릿수씩 겹치면서 순환하는 6개의 수가, 각각 3각수, 4각수, ..., 8각수가 되는 수열을 구하라는 것입니다. 3각수가 되는 4자리 수를 구한후, 뒤의 두자리수로 시작하는 4각수가 되는 수를 구하는 식으로 연결지어서 최종적으로 3각수의 첫두자리수로 끝나는 8각수를 만들면 됩니다. 제 경우에는 미리 n각수를 다 구한다음에, 해당수들이 순환하는지 검사하는 코드를 작성했습니다. 실제로 4자리 n각수가 많지는 않습니다. 모든 n각수는 2차식이기 때문에 상당히 빠르게 숫자가 커집니다. #inc.. 2016. 6. 18.
프로젝트 오일러 #60 소수쌍 집합 이번 문제는 처음으로 난이도 20%짜리 문제입니다. 소수쌍이라고 해서 특별한 수학적인 내용이 들어가 있는 것은 아닙니다. 3, 7 이 두개의 소수가 있다고 하면, 이 두개의 소수를 단순하게 이어서 37, 73을 만들었을 때, 이 수들도 소수가 되면, (3, 7)은 소수쌍이 되는 것입니다. 이러한 소수들은 무한히 존재하겠지만, 빈도가 많지는 않습니다. 이 문제를 풀기 위해서는 메모리를 사용해서 해당되는 셋들을 만들것인가가 중요했습니다. 그렇게 하려면, 너무 자료구조가 복잡해서, 약간의 꼼수를 사용했습니다. 일단, 소수들을 결합하기 위한 재료는 미리 저장을 해놓고, 소수들을 결합한 결과에 대한 소수 검사는 별도의 라이브러리를 이용했습니다. 그리고 min이라는 정적 변수를 두어서, 이 값을 이용해서 현재 구해.. 2016. 6. 17.
59. 프로젝트 오일러 #59 : XOR 암호 풀기 이번 문제는 난이도가 5%이기는 하지만, 실제로 정석대로 푼다면 5%보다 높을 것 같네요. 암호를 푸는 방법은 무식한 방법으로 반복대치를 하는 경우가 많습니다. 단순 반복대치를 하면 풀 수는 있겠지만, 보통 수만대의 컴퓨터를 동원해도 몇천년, 몇만년 이상 걸리는 경우가 허다합니다. 양자컴퓨터가 나온다면 좀 달라질 수 있겠지만요. 이 문제에서는 주어진 텍스트에 3글자 소문자로 이루어진 키를 가지고 암호를 푸는 것입니다. 원래 문제 의도(난이도 5%)였다면, 3글자 소문자 키를 생성하고, 그것에 의해서 영어의 일반 언어가 도출되는지를 검사하면 되겠죠. 예를 들어서 a, this, is, are, you, 등등이 될겁니다. 전 고전적인 방법, 즉, 암호키를 알기 힘들다는 가정하에서 풀어보았습니다. 물론 암호키.. 2016. 6. 16.
58. 프로젝트 오일러 #58 : 나선형 소수들 #58 문제도 난이도는 5% 문제입니다. 문제 자체는 복잡해 보여도 사실 푸는데 전혀 어려움이 없는 문제예요. 문제는 1부터 차례대로 나선형으로 수들을 배치하게 되면, 대각선쪽에는 홀수가 항상 배치되게 됩니다. 그럴 경우, 대각선에 있는 홀수 중 소수의 비율이 얼마일것인가가 이 문제를 푸는데 중요한 부분입니다. 이 문제는 소수의 비율이 10% 미만으로 떨어질 때, 한 변에 위치하는 수들의 갯수를 답하라는 것입니다. 배치하는 방법이 일정하기 때문에, 대각선에 위치한 숫자들의 순열만 파악하면 됩니다. 일단 첫번째 대각선(가장 작은 수)의 수열은 다음과 같이 표현할 수 있습니다. s를 한변 길이의 절반이라고 할 때(즉, 1이 위치한 s는 0, 그 다음은 1, 그 다음은 2.. ), 이 것을 이용하여, 다음 수.. 2016. 6. 15.
57. 프로젝트 오일러 #57 : 제곱근의 수렴 이번 문제는 수학 문제인 듯 보이지만, 그냥 단순 계산 문제입니다.프로젝트 오일러 사이트 난이도 평가 5% 문제네요. 문제의 내용은 2의 제곱근을 구할 때, 연분수 전개를 할 수가 있습니다. 연분수 전개에 관련해서는 펠의 방정식(http://sdev.tistory.com/213) 글을 참조하세요. 와 같이 2의 제곱근을 표시할 수 있습니다. 이 문제에서는 이것이 중요한 것이 아니고, 이 연분수 전개를 할 때, 분수로 표현하게 되면, 분모와 분자가 모두 정수가 되는데, 분자의 정수부가 분보의 정수부보다 자릿수가 많은 것이 몇개가 있는 가가 문제입니다. 연분수 전개를 분수로 만들면 되는 것이지만, 연분수 전개 자체가 상당히 큰 자릿수가 나옵니다. 물론 double 형을 이용해서 근사치로 계산해도 되겠지만, .. 2016. 6. 14.
56. 프로젝트 오일러 #56 : 제곱수의 자릿수 합 이 문제는 난이도 5% 문제이지만, BigInt 모듈이 없는 언어 사용자는 해당 모듈을 구해야 하는 어려움이 있습니다. 파이썬 등을 이용하면 간단하게 해결할 수 있습니다. 문제는 간단합니다. a, b < 100 안에서 a의 b제곱한 결과를 10진수로 표현할 때, 모든 자릿수의 합 중 최대값을 찾으라는 것입니다. 최소값은 1인 것은 당연하고요. 좀 더 좋은 알고리즘을 찾는다는 것은 어려울 것 같습니다. 그냥 무식한 방법으로 풀어보았습니다. #include #include #include "NxBigInt.h" void solve1() { int v = 9, a, b; for( int i = 2 ; i < 100 ; i++ ) { NxBigInt m = i; for( int j = 2 ; j < 100 ; .. 2016. 6. 13.
728x90