#include<stdio.h>
#include<stdlib.h>

/* 整数の各桁の和を求める関数 */
int get_digit_sum(long num)
{
  int sum = 0;
  while(num>0){
    sum += num % 10; /* 最下位の数字をsumに加算する */
    num /= 10;       /* numから最下位の数字を除いた数に変換 */
  }
  return sum;
}

/* 素因数分解して，各桁の和を求める関数 */
int get_factor_digit_sum(long num)
{
  int sum = 0;         /* 最終的に解を返すための変数 */
  int i;
  int num_factor = 0;  /* 素数を除外するために素因素の数を保存する */
  /* まずは偶数でなくなるまで2で割り続ける */
  while(num % 2==0){
    num /= 2;
    sum += 2;
    num_factor++;
  }
  /* その後，numが１になるまで奇数で割り続ける */
  for(i= 3; num!= 1 ;i+= 2){
    while(num % i==0){
      num /= i;
      sum += get_digit_sum(i); /* 見つけた素因数の各桁の和を求める必要がある */
      num_factor++;
    }
  }
  /* 素数だった場合は0を返して後の判定で自動的に除外されるようにする */
  if(num_factor != 1) return sum;
  else return 0;
}

main(int argc,char **argv)
{
  long num,max=0;
  int digit_sum,factor_sum;
  /* 探索の最大値はプログラムの引数で指定する */
  /* 指定されていない場合は終了する */
  if(argc != 2){
    printf("usage:%s (MAX_NUMBER)\n",argv[0]);
    exit(0);
  }
  max = atoi(argv[1]);  /* 引数は文字列なので整数に変換して保存する．atoi()はstdlib.hにある標準ライブラリ関数 */
  for (num=2; num <= max; num++){
    digit_sum = get_digit_sum(num); /* 各桁の和を求める */
    factor_sum = get_factor_digit_sum(num); /* 素因数分解して，各桁の和を求める */
    if(digit_sum == factor_sum ) /* 素数はfactor_sum==0になるので除外される */
      printf("%ld\n", num);
  }
  return 0;
}
