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<stdio.h>
int main (){
	int N[4],L,S,c,i,a;
	while(1){
		for(i=0;i!=4;i++){
			scanf("%1d",&N[i]);
		}
		if(N[0]==N[1]&&N[2]==N[3]&&N[1]==N[2]){
			if(N[1]==0)
				break;
			else
				puts("NA");
		}
		else{
			for(i=0;c!=6174;i++){
				for(S=0;S!=4;S++){
					for(a=S;a!=4;a++){
						if(N[S]<N[a]){
							c=N[a];
							N[a]=N[S];
							N[S]=c;
						}
					}
				}
				L=1000*N[0]+100*N[1]+10*N[2]+N[3];
				S=1000*N[3]+100*N[2]+10*N[1]+N[0];
				L-=S;
				c=L;
				N[0]=L/1000;
				L%=1000;
				N[1]=L/100;
				L%=100;
				N[2]=L/10;
				L%=10;
				N[3]=L;
			}
			printf("%d\n",i);
		}
	}
}

#include<stdio.h>
int main (){
	int N[4],L,S,c,i,a;
	while(1){
		for(i=0;i!=4;i++){
			scanf("%1d",&N[i]);
		}
		if(N[0]==N[1]&&N[2]==N[3]&&N[1]==N[2]){
			if(N[1]==0)
				break;
			else
				puts("NA");
		}
		else{
			for(i=0;c!=6174;i++){
				for(S=0;S!=4;S++){
					for(a=S;a!=4;a++){
						if(N[S]<N[a]){
							c=N[a];
							N[a]=N[S];
							N[S]=c;
						}
					}
				}
				L=1000*N[0]+100*N[1]+10*N[2]+N[3];
				S=1000*N[3]+100*N[2]+10*N[1]+N[0];
				L-=S;
				c=L;
				N[0]=L/1000;
				L%=1000;
				N[1]=L/100;
				L%=100;
				N[2]=L/10;
				L%=10;
				N[3]=L;
			}
			printf("%d\n",i);
		}
	}
return 0;
}

C++: #include<stdio.h>
int main(void)
{
	int a,flg,b,r,A,i,j,X,W,w,x[100];
	while(1){
		scanf("%d",&a);
		flg=0;
		r=0;
		if(a==0000) break;
		while(1){
			if(a%1111==0){
				flg=1;
				break;
			}
			else if(a==6174) break;
			r++;
			A=a;
			b=1000;
			for(i=0;i<4;i++){
				x[i]=a/b;
				a=a-x[i]*b;
				b/=10;
			}
			for(i=0;i<4;i++){
				for(j=i+1;j<4;j++){
					if(x[i]<x[j]){
						X=x[i];
						x[i]=x[j];
						x[j]=X;
					}
				}
			}
			w=x[0]*1000+x[1]*100+x[2]*10+x[3];
			b=1000;
			for(i=0;i<4;i++){
				x[i]=A/b;
				A=A-x[i]*b;
				b/=10;
			}
			for(i=0;i<4;i++){
				for(j=i+1;j<4;j++){
					if(x[i]>x[j]){
						X=x[i];
						x[i]=x[j];
						x[j]=X;
					}
				}
			}
			W=x[0]*1000+x[1]*100+x[2]*10+x[3];
			a=w-W;
		}
		if(flg==1){
				printf("NA\n");
		}
		else if(a==6174){
			printf("%d\n",r);
		}
	}
	return 0;
}

C++: #include<stdio.h>
int main(void)
{
    int n,i,j,a[4],b[4],c[4],w,f,flg;
	while(1){
	    f=0;
		flg=0;
	    scanf("%d",&n);
		if(n==0) break;
		while(1){
		    if(n==6174) break;
			a[0]=n/1000;
			a[1]=(n-a[0]*1000)/100;
			a[2]=(n-a[0]*1000-a[1]*100)/10;
			a[3]=n-a[0]*1000-a[1]*100-a[2]*10;
			if(a[0]==a[1]&&a[1]==a[2]&&a[2]==a[3]){
			    printf("NA\n");
				flg=1;
				break;
			}
			for(i=0;i<3;i++){
			    for(j=i;j<4;j++){
				    if(a[i]<a[j]){
					    w=a[i];
						a[i]=a[j];
						a[j]=w;
					}
				}
			}
			for(i=0;i<4;i++) b[i]=a[i];
			for(i=0;i<3;i++){
			    for(j=i;j<4;j++){
				    if(a[i]>a[j]){
					    w=a[i];
						a[i]=a[j];
						a[j]=w;
					}
				}
			}
			for(i=0;i<4;i++) c[i]=a[i];
			n=(b[0]*1000+b[1]*100+b[2]*10+b[3])-(c[0]*1000+c[1]*100+c[2]*10+c[3]);
			f++;
		}
		if(flg==0) printf("%d\n",f);
	}
	return 0;
}

C++: #include <iostream>
#include <string>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int solve(string s){
    if(s[0]==s[1]&&s[1]==s[2]&&s[2]==s[3])return -1;
    
    for(int cou=0;;cou++){
        if(s=="6174")return cou;
        
        string L,S;
        L=S=s;
        sort(L.begin(),L.end(),greater<char>());
        sort(S.begin(),S.end());
        int x=atoi(L.c_str())-atoi(S.c_str());
        for(int i=3;i>=0;i--,x/=10){
            s[i]='0'+x%10;
        }
      
    }
}
int main(void){
  while(1){
      string n;
      cin>>n;
      if(n=="0000")break;
      
      int ans=solve(n);
      if(ans==-1)cout<<"NA"<<endl;
      else cout<<ans<<endl;
  }
}

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 << std::setw(keta)<<std::setfill('0')  << 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;
}

C++: #include<stdio.h>
int main(void)
{
	int n;
	int l,s;
	int i,j,temp;
	int keta[4];
	int cnt;
	
	scanf("%d",&n);
	
	while(n!=0000){
		if(n%1111==0){
			printf("NA\n");
			break;
		}
		while(n!=6174){
			for(i=0;i<4;i++){
				keta[i]=n%10;
				n=n/10;
			}
			for(i=0;i<3;i++){
				for(j=i+1;j<4;j++){
					if(keta[i]<keta[j]){
						temp=keta[i];
						keta[i]=keta[j];
						keta[j]=temp;
					}
				}
			}
			l=keta[0]*1000+keta[1]*100+keta[2]*10+keta[3];

			for(i=0;i<3;i++){
				for(j=i+1;j<4;j++){
					if(keta[i]>keta[j]){
						temp=keta[i];
						keta[i]=keta[j];
						keta[j]=temp;
					}
				}
			}
			s=keta[0]*1000+keta[1]*100+keta[2]*10+keta[3];
			n=l-s;
			cnt++;
		}
	printf("%d\n",cnt);
	}
	return 0;
}

C++: #include <iostream>
#include <algorithm>

int main() {
	int n;
	int a[4] = {};

	while (std::cin >> n) {
		if (n == 0000)
			break;

		if (n % 1111 == 0) {
			std::cout << "NA" << std::endl;
			continue;
		}

		int count = 0;
		while (n != 6174) {
			a[0] = n / 1000, n %= 1000;
			a[1] = n / 100, n %= 100;
			a[2] = n / 10, n %= 10;
			a[3] = n;

			std::sort(a, a + 4);

			n = 0;
			n += (a[3] - a[0]) * 1000;
			n += (a[2] - a[1]) * 100;
			n += (a[1] - a[2]) * 10;
			n += a[0] - a[3];

			++count;
		}

		std::cout << count << std::endl;
	}
	return 0;
}

C++: #include<iostream>
#include<string>
#include<sstream>
#include<cmath>
#include<algorithm>
#include<cassert>
using namespace std;


bool allsame(int n){
  int tmp=n%10;
  n/=10;
  while(n!=0){
    if(tmp!=n%10){
      return 0;
    }
    tmp=n%10;
    n/=10;
  }
  return 1;
}

string toSortString(int n){
  string res="0000";
  int tmp[4]={0,0,0,0};
  for(int i=0;n!=0;i++){
    tmp[i]=n%10;
    n/=10;
  }
  for(int i=0;i<4;i++){
    res[i]=tmp[i]+'0';
  }
  sort(res.begin(),res.end());
  return res;
}

int make_l(string s){
  int res=0;
  for(int i=0;i<s.size();i++){
    res+=(s[i]-'0')*pow(double(10),i);
  }
  return res;
}

int make_s(string s){
  int res=0;
  for(int i=0;i<s.size();i++){
    res+=(s[s.size()-1-i]-'0')*pow(double(10),i);
  }
  return res;
}

int main(){
  int n;
  int ans=0;
  while(cin>>n,n!=0){
    while(n!=6174){
      if(allsame(n)){
        cout<<"NA"<<endl;
        break;
      }
      ans++;
      int l,s;
      string tmp_n=toSortString(n);
      l=make_l(tmp_n);
      s=make_s(tmp_n);
      n=l-s;
      assert(ans<=7);