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

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

/* ループ回数の上限 */
#define MAX_LOOP 50

/* 関数のプロトタイプ宣言 */
int factorial(int n);
int factorial_sum(int n);
int is_factorial_loop(int);

int main(){
  int i,k;
  printf("Factorial loops\n");
  for(i=1; i<MAX_NUM; i++)
    /* 各桁の数字の階乗の和を繰り返し計算すると同じ数になるかどうかを確認 */
    if(k=is_factorial_loop(i)) 
        printf("%d --> %d loop%s\n", i,k, (k>1 ? "s" : ""));
  return 0;
}

/* 各桁の数字の階乗の和を繰り返し計算すると同じ数になるかどうかを返す関数 */
/* なるなら1，ならないなら0を返す */
int is_factorial_loop(int n){
  int i;
  int x=n;
  for(i=0; i<MAX_LOOP; i++){
    x=factorial_sum(x);
    if (x==n) return i+1;
  }
  return 0;
}

/* 各桁の数字の階乗の和を返す関数 */
int factorial_sum(int n){
  int i, ret=0;
  /* 各桁の数字の階乗の和を計算 */
  for(i=n; i>0; i=i/10){
    ret += factorial(i%10);
  }
  return ret;
}

/* nの階乗を返す関数 */
int factorial(int n){
  int i;
  int ret=1;
  if (i==0) return 0;
  for(i=1; i<=n; i++) ret *= i;
  return ret;
}
