본문 바로가기
Project Euler

Project Euler #55 (Lychrel numbers)

by suminhan 2016. 9. 19.

문제는 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");
}


댓글