문제는 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 |
댓글