Go: package main

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

var memo []int

func solve(v int) int {
	if v == 6174 {
		return 0
	}
	if memo[v] == 0 {
		str := ([]byte)(strconv.Itoa(v))
		sort.Slice(str, func(i, j int) bool {
			return str[i] < str[j]
		})
		s, _ := strconv.Atoi(string(str))
		sort.Slice(str, func(i, j int) bool {
			return str[i] > str[j]
		})
		l, _ := strconv.Atoi(string(str))
		memo[v] = solve(l-s) + 1
	}
	return memo[v]
}

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

C++: #include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    while(1){
        int num;
        cin>>num;
        if(num==0)break;
        int numnum[4];
        int ans=0;
        while(1){
            if(num==6174){
                cout<<ans<<endl;
                break;
            }
            numnum[0]=num%10000/1000;
            numnum[1]=num%1000/100;
            numnum[2]=num%100/10;
            numnum[3]=num%10/1;
            if(numnum[0]==numnum[1]&&numnum[0]==numnum[2]&&numnum[0]==numnum[3])puts("NA");
            int nummax[4];
            int nummin[4];
            for(int i=0;i<4;i++){
                nummax[i]=numnum[i];
                nummin[i]=numnum[i];
            }
            sort(nummax,nummax+4);
            sort(nummin,nummin+4);
            swap(nummax[0],nummax[3]);swap(nummax[1],nummax[2]);
            int mx=nummax[0]*1000+nummax[1]*100+nummax[2]*10+nummax[3]*1;
            int mn=nummin[0]*1000+nummin[1]*100+nummin[2]*10+nummin[3]*1;
            //printf("[%d][%d]\n",mx,mn);
            num=mx-mn;
            ans++;
        }
    }
    return 0;
}

C++: #include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
	string a;
	while (getline(cin,a)&&a != "0000") {
		int b[4], l = 0, s = 0, f = atoi(a.c_str()), sum = 0;
		if (a[0] != a[1] || a[1] != a[2] || a[2] != a[3]) {
			while (f != 6174) {
				a = to_string(f);
				if (a.length() == 1)
					a = "000" + a;
				else if (a.length() == 2)
					a = "00" + a;
				else if (a.length() == 3)
					a = "0" + a;
				for (int i = 0; i < 4; i++) {
					b[i] = (int)a[i] - '0';
				}
				sort(b, b + 4);
				for (int i = 3; i >= 0; i--) {
					l += (pow(10, i)*b[i]);
				}
				for (int i = 0; i < 4; i++){
					s += (pow(10,3 - i)*b[i]);
				}
				f = l - s;
				sum++;
				l = 0;
				s = 0;
			}
			cout << sum << endl;
		}
		else 
			cout << "NA" << endl;
	}
}

C++: #include<bits/stdc++.h>

#define endl '\n'

using namespace std;

int main(){

  cin.tie(0);     // cout と cin の同期を切る
  ios::sync_with_stdio(false);  /* cの stdioストリーム (printfとか)と*/

  string str;

  while(1){

    
    cin>>str;
    
    int a[4];
    
    if(str=="0000"){
      break;
    }else if(str[0]==str[1]&&str[1]==str[2]&&str[2]==str[3]){
      cout<<"NA"<<endl;
      continue;
    }

    for(int i=0;i<4;i++){
      a[i]=str[i]-'0';
    }
    int cnt=0;

    while(1){

      int c[4];

      c[0]=a[0];
      c[1]=a[1];
      c[2]=a[2];
      c[3]=a[3];

      
      if(c[0]==6&&c[1]==1&&c[2]==7&&c[3]==4){
	break;
      }
      
      sort(a,a+4);
      
      int cnt1=a[0]*1000+a[1]*100+a[2]*10+a[3];
      int cnt2=a[3]*1000+a[2]*100+a[1]*10+a[0];
      
      cnt2=cnt2-cnt1;
      
      c[3]=cnt2%10;
      cnt2/=10;
      c[2]=cnt2%10;
      cnt2/=10;
      c[1]=cnt2%10;
      cnt2/=10;
      c[0]=cnt2%10;


      cnt++; 

      a[0]=c[0];
      a[1]=c[1];
      a[2]=c[2];
      a[3]=c[3];

    }

    cout<<cnt<<endl;
  }

  return 0;

}

C++: #include <cstdio>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
#include <string>
#include <sstream>

#define rep(i, j) FOR(i, 0, j)
#define FOR(i, j, k) for(int i = j; i < k; ++i)

using namespace std;

int main(){
  char n[5];
  while(scanf("%s", n) && strcmp(n, "0000") != 0){
    if(n[0] == n[1] && n[1] == n[2] && n[2] == n[3]){ puts("NA"); continue;}
    int c = 0;
    while(strcmp(n, "6174")){
      rep(i, 4) FOR(j, i + 1, 4){
	if(n[i] > n[j]){ char tmp = n[i]; n[i] = n[j]; n[j] = tmp;}
      }
      int a = atoi(n);
      char tmp = n[0]; n[0] = n[3]; n[3] = tmp;
      tmp = n[1]; n[1] = n[2]; n[2] = tmp;
      int b = atoi(n);
      b -=  a;
      sprintf(n, "%04d", b);
      c++;
    }
    printf("%d\n", c);
  }
  return 0;
}

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;
}