Go: package main

import (
	"fmt"
	"sort"
	"strconv"
)

var memo []int

func solve(v int) int {
	if v == 6174 {
		return 0
	}
	if memo[v] == 0 {
		a := make([]int, 4)
		for i := 0; i < 4; i++ {
			a[i] = v % 10
			v /= 10
		}
		sort.Slice(a, func(i, j int) bool {
			return a[i] > a[j]
		})
		l := int(0)
		for i := 0; i < 4; i++ {
			l *= 10
			l += a[i]
		}
		sort.Slice(a, func(i, j int) bool {
			return a[i] < a[j]
		})
		s := int(0)
		for i := 0; i < 4; i++ {
			s *= 10
			s += a[i]
		}
		memo[v] = solve(l-s) + 1
	}
	return memo[v]
}

func main() {
	var v int
	memo = make([]int, 10000)
	for {
		var s string
		fmt.Scan(&s)
		v, _ = strconv.Atoi(s)
		if v == 0 {
			break
		}
		if v%1111 == 0 {
			fmt.Println("NA")
			continue
		}
		fmt.Println(solve(v))
	}
}

C++: #include<stdio.h>

#define DATA_MAX 10000//データセットは10000を超えない
#define END_NUM 6174//おわりの数

int scan(void);//入力
int Lput(int n);//Ｌを求める
int Sput(int n);//Sを求める
void cut(int n,int num[4]);//ｎの値をばらして送り返す関数
int nmake(int num[4]);//もう一回ｎを組み立て直す関数
int Nput(int l,int s);//新しいＮを生成する
void print(int ans[DATA_MAX],int data);//出力をする

int main(){
  int n;//判定する数
  int l;//ｎの桁を大きい順に並べた結果
  int s;//nの桁を小さい順に並べた結果
  int ans[DATA_MAX];//こたえを格納する変数
  int data=0;//データセットの数を格納
  int count=0;//処理を行った回数を一時的に格納する変数
  
  n=scan();//nの入力
  while(n!=0&&n>999){//ゼロでない限り続ける
    if(n!=END_NUM){
      do{
	l=Lput(n);//Lを求める
	s=Sput(n);//Sを求める
	n=Nput(l,s);//新しいｎを生成する
	count++;
	if(n==0){
	  n=END_NUM;
	  count=-1;
	}
      }while(n!=END_NUM);//n=6174であったら終了
      ans[data]=count;
      data++;
    }else{//最初から6174だったら
      ans[data]=0;
      data++;
    }
    n=scan();
  }
  
  print(ans,data);//出力をする
  
  return(0);
}

//入力する関数
int scan(void){
  int n;
  scanf("%d",&n);
  return(n);
}

//Ｌを求める関数
int Lput(int n){
  int i,j;//カウンタ
  int temp;//入れ換えの時に使う奴
  int num[4];
  cut(n,num);
  
  //並べ替え
  for(i=0;i<4;i++){
    for(j=3;j>i;j--){
      if(num[i]<num[j]){
	temp=num[i];
	num[i]=num[j];
	num[j]=temp;
      }
    }
  }
  return(nmake(num));
}

//Sを求める関数
int Sput(int n){
  int i,j;//カウンタ
  int temp;//入れ換えの時に使う奴
  int num[4];
  cut(n,num);
  
  //並べ替え
  for(i=0;i<4;i++){
    for(j=3;j>i;j--){
      if(num[i]>num[j]){
	temp=num[i];
	num[i]=num[j];
	num[j]=temp;
      }
    }
  }
  return(nmake(num));
}
//バラス
void cut(int n,int num[4]){
  int i;
  int ten=1000;
  for(i=0;i<4;i++){
    num[i]=n/ten;
    n=n%ten;
    ten=ten/10;
  }
  return;
}

//もっかいくみたてる
int nmake(int num[4]){
  int i;
  int n;
  int ten=1000;
  for(i=0;i<4;i++){
    n=n+num[i]*ten;
    ten=ten/10;
  }
  return(n);
}

//新しいｎを生成する
int Nput(int l,int s){
  return(l-s);
}

void print(int  ans[DATA_MAX],int data){
  int i;
  for(i=0;i<data;i++){
    if(ans[i]==-1){
      printf("NA\n");
    }else{
    printf("%d\n",ans[i]);
    }
  }
  return;
}

C++: #include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;

ll f(ll n);
void dig(ll n, ll d[]);
ll make_l(ll n);
ll make_s(ll n);
bool isOK(ll n);

ll dp[10005];

int main()
{
    for (int i = 0; i <= 10005; i++) {
        dp[i] = -1;
    }
    dp[6174] = 0;

    ll n;
    
    while (scanf("%lld", &n), n != 0) {
        if (!isOK(n)) {
            printf("NA\n");
        }
        else {
            printf("%lld\n", f(n));
        }
    }

    return 0;
}

ll f(ll n)
{
    if (dp[n] != -1) {
        return dp[n];
    }

    ll l = make_l(n);
    ll s = make_s(n);

    return dp[n] = f(l - s) + 1;
}

void dig(ll n, ll d[])
{
    d[n % 10]++;
    d[(n / 10) % 10]++;
    d[(n / 100) % 10]++;
    d[(n / 1000) % 10]++;
}

ll make_l(ll n)
{
    ll d[10] = {};
    ll ret = 0;

    dig(n, d);

    for (int i = 9; i >= 0; i--) {
        while (d[i]) {
            d[i]--;
            ret *= 10;
            ret += i;
        }
    }

    return ret;
}

ll make_s(ll n)
{
    ll d[10] = {};
    ll ret = 0;

    dig(n, d);

    for (int i = 0; i <= 9; i++) {
        while(d[i]) {
            d[i]--;
            ret *= 10;
            ret += i;
        }
    }

    return ret;
}

bool isOK(ll n)
{
    ll d[10] = {};

    dig(n, d);
    for (int i = 0; i <= 9; i++) {
        if (d[i] == 4) {
            return false;
        }
    }

    return true;
}

C++: #include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
  int n;

  while (scanf("%d", &n), n){
    int cnt = 0;
    int num[4];
    int L, S;
    if (n % 1111 == 0){
      printf("NA\n");
      continue;
    }
    while (n != 6174){
      cnt++;
      for (int i = 0; i < 4; i++){
        num[i] = n % 10;
        n /= 10;
      }
      sort(num, num + 4);
      L = num[3] * 1000 + num[2] * 100 + num[1] * 10 + num[0];
      S = num[0] * 1000 + num[1] * 100 + num[2] * 10 + num[3];
      n = L - S;
    }
    printf("%d\n", cnt);
  }

  return (0);
}

C++: #include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int simuration(string TES){
    if(TES[0] == TES[1] && TES[1] == TES[2] && TES[2] == TES[3]){
        return -1;
    }else{
    int z,cnt = 0;
    
        while(TES[0] != '6' && TES[0] != '1' && TES[0] != '4' && TES[0] != '7'){
            sort(TES.begin(),TES.end());
            int x = atoi(TES.c_str());
            sort(TES.begin(),TES.end(),greater<char>());
            int y = atoi(TES.c_str());
            z = y - x;
            TES = to_string(z);
            cnt++;
        }
    return cnt;
    }
}

int main(void){
    
    string TES;
    while(TES != "0000"){
    cin >> TES;
        if(TES == "0000")   return false;
    int judge = simuration(TES);
        if(judge == -1) {
            cout << "NA" << endl;
        }else{
            cout << simuration(TES) << endl;
        }
    }
}

C++: 
#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>
#include <cstdio>
#include <cassert>

using namespace std;

int toInt(string s){int v;istringstream sin(s);sin>>v;return v;}
template<class T> inline string toString(T x) {ostringstream sout;sout<<x;return sout.str();}

int main(void)
{
	string n;
	while (cin >> n && n != "0000"){
		if (count(n.begin(), n.end(), n[0]) == 4){
			cout << "NA" << endl;
		}
		assert(n != "0000");

		int tmp = toInt(n);
		char str[128];
		sprintf(str, "%04d", tmp);
		n = string(str);
		int cnt = 0;
		while (n != "6174"){
			if (count(n.begin(), n.end(), n[0]) == 4){
				cout << "NA" << endl;
				goto END;
			}
			string L = n; sort(L.rbegin(), L.rend());
			string S = n; sort(S.begin(), S.end());
			// cout << n << " " << L << " " << S << endl;
			int tmp = toInt(L) - toInt(S);
			char str[128];
			sprintf(str, "%04d", tmp);
			n = string(str);
			cnt++;
		}
		cout << cnt << endl;
		END:;
	}

	return 0;
}

C++: #include "bits/stdc++.h"
#include<unordered_map>
#include<unordered_set>
#pragma warning(disable:4996)
using namespace std;
using ld = long double;
template<class T>
using Table = vector<vector<T>>;
const ld eps=1e-9;

//// < "D:\D_Download\Visual Studio 2015\Projects\programing_contest_c++\Debug\a.txt"

string to_string_keta(const long long int l,const int keta) {
	ostringstream oss;

	oss << setprecision(keta) << l;

	return oss.str();
}

int main() {
	while (1) {
		int N; cin >> N;
		if (!N)break;
		if (N % 1111 == 0) {
			cout << "NA" << endl;
			continue;
		}
		int num = 0;
		while (1) {
			if (N == 6174)break;
			string st(to_string_keta(N, 4));
			sort(st.begin(), st.end());
			int amin(stoi(st));
			reverse(st.begin(), st.end());
			int amax(stoi(st));
			N = amax - amin;
			num++;

		}
		cout << num << endl;
	}
	
	return 0;
}