#include <stdio.h>
#include <string.h>
#include <math.h>

/* 数の上限 */
#define MAX_NUM (long long int)(1e5)

/* 文字列の長さ上限 */
#define MAX_LEN (20)

/* 関数のプロトタイプ宣言 */
long long int triangle(long long int);
int is_triangle(long long int);
int is_kaibun(long long int);

int main(){
  long long int i,n=0;

  for(i=1; (n=triangle(i))<MAX_NUM; i++){
    /* i番目の三角数nが回文かどうかを確認 */
    if(is_kaibun(n)) 
       printf("回文数 %lld は三角数である (%lld*(%lld+1)/2).\n",
               n, i, i);
  }
  return 0;
}

/* n番目の三角数を返す関数 */
/* n番目の三角数は，n(n+1)/2 で表される */
long long int triangle(long long int n){
 return n*(n+1)/2;
}

/* nが三角数かどうかを返す関数 */
/* 三角数なら1，そうでないなら0を返す */
int is_triangle(long long int n){
  /* i(i+1)/2=n　を解くと，i=-1/2+sqrt(1/4+2n) */
  long long int i = sqrt(0.25+2*n)-0.5;
  if(triangle(i) == n) return i;
  return 0;
}

/* 数字nが回文かどうかを返す関数 */
/* 回文なら1，そうでないなら0を返す */
int is_kaibun(long long int n){
  char str[MAX_LEN];
  int i,len=0;
  /* 数字を文字列に変換 */
  sprintf(str, "%lld", n);
  /* 文字列の長さを取得 */
  len = strlen(str);
  /* 文字列が回文かどうかを確認 */
  /* 前からi番目と後ろからi番目が同じ文字ならよい */
  for(i=0; i<len/2; i++){
    if(str[i] != str[len-i-1]) return 0;
  }
  return 1;
}
