문제는 https://projecteuler.net/problem=55
50회 이상 palindrome-sum-iteration을 돌려도 palindrome이 나오지 않는 Lychrel numbers에 대한 문제이다.
#include <stdio.h> #include <windows.h> #define ASIZE 30 #define MITER 50 void deep_copy(int n[], int m[]) { int i; for (i = 0; i < ASIZE; i++) m[i] = n[i]; } void func(int m[]) { int temp[ASIZE]; int i, lim; for (i = ASIZE - 1; i >= 0; i--) { if (m[i] != 0) { lim = i + 1; break; } } for (i = 0; i < lim; i++) { temp[i] = m[i]; } for (i = 0; i < lim; i++) { m[i] = temp[i] + temp[lim - 1 - i]; } for (i = 0; i < lim; i++) { if (m[i] >= 10) { m[i + 1]++; m[i] %= 10; } } } bool is_palindrome(int m[]) { int i, lim; for (i = ASIZE - 1; i >= 0; i--) { if (m[i] != 0) { lim = i + 1; break; } } for (i = 0; i < lim; i++) { if (m[i] != m[lim - 1 - i]) return false; } return true; } bool is_lychel(int m[]) { int iter = 0; while (iter++ < MITER) { func(m); if (is_palindrome(m)) return false; } return true; } void increase(int n[]) { int i, lim = 0; for (i = ASIZE - 1; i >= 0; i--) { if (n[i] != 0) { lim = i + 1; break; } } n[0]++; for (i = 0; i < lim; i++) { if (n[i] >= 10) { n[i + 1] += 1; n[i] %= 10; } } } void main() { int n[ASIZE], m[ASIZE]; int i, count = 0; for (i = 0; i < ASIZE; i++) n[i] = 0; n[1] = 1; // n >= 10 while (n[4] < 1) { deep_copy(n, m); if (is_lychel(m)) count++; increase(n); } printf("count = %d\n", count); system("pause"); }
'Project Euler' 카테고리의 다른 글
Project Euler #58 (Spiral primes) (0) | 2016.09.27 |
---|---|
Project Euler #108 (Diophantine reciprocals I) (0) | 2016.09.09 |
Project Euler #105 (Special subset sums: testing) (0) | 2016.09.09 |
Project Euler #106 (Special subset sums: meta-testing) (0) | 2016.09.09 |
Project Euler #103 (Special subset sums: optimum) (0) | 2016.09.09 |
댓글