USACO Training – Dual Plindromes
/*
ID: fourck1
LANG: C
TASK: dualpal
*/
/*#define __DEBUG__*/
#define TRUE 1
#define FALSE 0
#define MAX 100
#include <stdio .h>
int isDualPalindrome(int num);
int checkPalindrome(int num[], int pos);
int main()
{
int N;
int S;
int i;
int count = 0;
#ifndef __DEBUG__
FILE *fin;
FILE *fout;
fin = fopen("dualpal.in","r");
fout = fopen("dualpal.out","w");
fscanf(fin, "%d", &N);
fscanf(fin, "%d", &S);
#else
printf("how many do you want to get palindromes : ");
scanf("%d", &N);
printf("what number do you want to palindromes that greater than? : ");
scanf("%d", &S);
#endif
for (i = S + 1 ; ; i++)
{
if (isDualPalindrome(i) == TRUE)
{
#ifndef __DEBUG__
fprintf(fout, "%d\n", i);
#else
printf("%d\n", i);
#endif
count++;
}
if (count == N) break;
}
#ifndef __DEBUG__
fclose(fin);
fclose(fout);
#endif
return 0;
}
int isDualPalindrome(int num)
{
int i;
int changedNum[MAX];
int pos;
int temp;
int palCount = 0;
for (i = 2 ; i < = 10 ; i++)
{
pos = 0;
temp = num;
do
{
changedNum[pos++] = temp % i;
} while(temp = temp / i);
if (checkPalindrome(changedNum, pos) == TRUE)
{
palCount++;
if (palCount >= 2)
{
return TRUE;
}
}
}
return FALSE;
}
int checkPalindrome(int num[], int pos)
{
int i;
for (i = 0 ; i < = pos / 2 ; i++)
{
if (num[i] != num[pos-i-1])
{
return FALSE;
}
}
return TRUE;
}
주어진 수보다 큰 수 중에서 2~10진수로 표현했을때 두번 이상 palindrome(회문) 이 되는 수를 구하는 문제였다. 상당히 어렵게 생각하고 있었는데 실제로 해보니 의외로 쉽게 풀린 문제다.