본문 바로가기
반응형

프로젝트 오일러69

31. 프로젝트 오일러 #31 : 코인들의 합 이번문제는 재귀 함수를 만들어서 프로그램을 작성했습니다. 예를 들어서 200 파운드를 계산하기 위해서 첫번째 가장 큰 단위의 코인을 쓸 것인지부터 몇개를 쓸것인지 결정하여서 나머지 돈에 대해서 그 다음 단위의 코인을 이용하여 경우의 수를 따졌습니다. 코인의 금액을 200, 100, 50, 20, 10, 5, 2, 1 을 각각 으로 놓는다면, 경우의 수 를 금액 n에 대하여 i 이상에 대한 코인으로 조합하는 경우의 수라고 한다면, 다음과 같이 재귀적인 표현이 가능합니다. 이 방식을 이용해서 프로그램을 작성하면 다음과 같습니다. 프로그램은 참고용으로만 봐주세요. #include int getcomb(int n, int d); int main() { printf("Ans = %d\n", getcomb(200,.. 2015. 3. 30.
30. 프로젝트 오일러 #30 : 각 자릿수의 5승의 합 이번문제는 각 자릿수를 5승해서 그 합이 자기 자신이 되는 가를 보는 것입니다. 문제 자체의 난이도는 그리 어렵지 않죠. 일단 5승을 계산하는 것은 반복된 작업이라서 배열을 이용해서 0~9까지의 5승을 구해서 적어놓았습니다. 이렇게 하니까 문제 자체가 깔끔해지네요. 시간도 상당히 적게 들고요. 또 고민했던 것이 얼마나 많은 숫자까지 연산할 것인가였죠. 9의 5승이 59049이니까요. 6자리 숫자(9라는 숫자가 2개만 있어도 6자리이니)까지 가능하겠죠. 좀 더 잘 짠다면, 반복연산하는 부분을 더 줄일 수 있을텐데요. 프로그램 첨부합니다. 프로그램은 참고용으로만 봐주세요. #include int main() { int sum = 0; const int v[10] = { 0, 1, 32, 243, 1024, .. 2015. 3. 30.
프로젝트 오일러 #29 서로 다른 n제곱 개수 이번 문제는 중복을 처리하는 문제이기는 하지만, 숫자의 범위가 큰 까닭에, big integer를 써서 처리를 하든지, 아니면 무언가 다른 방도를 생각해서 해주어야 합니다. 서로 다른 n제곱 갯수를 구하기 위해서는 다음과 같은 생각을 좀 해주어야 합니다. 서로 다른, a, b (b > a) 에 대하여, \(a^m\), \(b^n\)이 갈은 수가 되기 위해서는 반드시, b는 a의 제곱승이어야 합니다. 그렇지 않다면, 같은 숫자가 나올 수가 없습니다. 이것을 토대로 해서 프로그램을 작성해보았습니다. 전반부 프로그램은 제곱수가 아닌 a 에 대하여 \(a^k\)을 모두 체크하고, 그 때의 연산 결과를 1승만 가능한 경우, 2승까지 가능한 경우, 3승까지 가능한 경우 등등으로 나누어서 그 출력값을 미리 v란 배열.. 2015. 3. 7.
28. 프로젝트 오일러 #28 : 회전하는 숫자들의 대각선 합 이 프로그램은 사실 원하는 배열을 잡고, 숫자를 배열한 후에 대각선의 합을 구해도 됩니다.그렇게 한다고 해서 시간이 엄청 걸리는 것도 아니니 말이죠. 그러나 처음 제가 이 프로젝트 오일러 글들을 쓰면서, 어떻게 하면 보다 빠르게 계산할 것인가를 고민했기 때문에, 이 문제 역시 복잡도를 낮추어 계산하도록 하였습니다. 1부터 N까지의 합, 제곱 합 등의 공식을 도출할 줄 안다면, 이 문제 역시 간단하게 하나의 식으로 만들 수 있습니다. 여기서는 다음과 같은 식이 나오게 됩니다. 이 수식에 따라서 구한 프로그램은 다음과 같습니다.역시 이 프로그램은 참고용으로만 해주세요. #include int main() { int n; scanf("%d", &n); n = (n-1)/2; printf("Ans = %d\n".. 2015. 3. 4.
27. 프로젝트 오일러 #27 : 2차식 소수 생성 2차식을 이용해서 소수를 생성하기 위한 2차식 파라미터를 찾는 프로그램입니다. 위 식은 너무나도 유명한 2차식 소수 생성 공식입니다. n의 값이 0부터 39까지 총 40개의 연속된 소수를 생성합니다. 더 많은 소수를 내기 위해서는 더 큰 숫자가 필요하겠죠. 일단 문제에 있는 것을 조금 더 보자면, 란 조건을 조금 더 줄일 필요가 있습니다. n = 0 일 때 위 식이 소수가 되기 위해서는 b 는 반드시 소수여야 합니다. 그러므로 b가 소수가 아니라면, a가 어떤 값이라도 원하는 답이 될 수가 없습니다. b가 소수라면, a는 -b보다 큰 수여야 하고, 홀수여야 합니다. |a|가 짝수라면, n이 홀수인 항에 대해서는 위 식은 반드시 짝수가 되어버립니다. 그러므로 |a|는 홀수여야 합니다. 매번 소수를 검사하는.. 2015. 2. 28.
26. 프로젝트 오일러 #26 : 순환고리 이번 문제는 가장 긴 순환고리를 찾는 문제입니다. 사실 순환고리는 오일러의 수 문제로 귀결됩니다. 오일러수는 다음과 같은 형태로 정의해서 낼 수 있습니다. 라고 한다면, 오일러의 수는 이라고 할 수 있습니다. 즉, n이 합성수라고 한다면, 오일러의 수는 엄청나게 줄어들게 됩니다. n이 소수라면 n-1 이 오일러의 수가 됩니다. 가장 긴 순환고리를 찾기 위해서는 사실 오일러의 수만 가지고 판단할 수는 없습니다. 10이란 숫자를 가지고 10이 n의 원시근이면 오일러의 수와 동일한 순환고리를 가지겠지만, 원시근이 아니라면, 오일러의 수의 약수 중 하나의 순환고리를 갖습니다. 일단 2의 배수와 5의 배수는 비순환고리를 가짐으로 실제 검사할 숫자들은입니다. 이 숫자 이외에는 비순환고리를 만듭니다. 예를 들어서 6.. 2015. 2. 27.
728x90