/*--------6174问题-----------
输入一个n位数,把所有数字从大到小排序得到a,从小到大得到b,然后用a-b替换原来这个数
并且继续操作。1234 、4321-1234=3087、8730-378=8352、8532-2358=6174
样例输入:1234
样例输出:1234->3087->8352->6074->6174
输入一个n位数,把所有数字从大到小排序得到a,从小到大得到b,然后用a-b替换原来这个数
并且继续操作。1234 、4321-1234=3087、8730-378=8352、8532-2358=6174
样例输入:1234
样例输出:1234->3087->8352->6074->6174
--------------------------------------------------*/
// 4.2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
typedef struct Node{
int index;
struct Node *next;
}node;
class Hash_Table{
public:
node* next[10];
Hash_Table(){
for (int i = 0; i < 10; i++){
next[i] = (node*)malloc(sizeof(node));
next[i]->index = i;
next[i]->next = NULL;
}
}
};
int Add_HashTable(int N, Hash_Table table){
int tmp=N;
while (1){
if (tmp < 10){
break;
}
tmp = tmp / 10;
}
node* pnode = (node*)malloc(sizeof(node));
pnode->index = N;
pnode->next = NULL;
node * p = table.next[tmp - 1];
if (p->next == NULL){
p->next = pnode;
return 1;
}
while (p->next->index != pnode->index){
p = p->next;
}
if (p->next->index == pnode->index){
return 0;
}
else{
p ->next = pnode;
return 1;
}
}
int Get_max(int N){
int *num = new int[];
int i = 0;
while (N > 0){
num[i++] = N % 10 ;
N = N / 10;
}
for (int j = 0; j < i - 1; j++){
for (int k = j + 1; k < i; k++){
if (num[j]<num[k]){
char tmp = num[k];
num[k] = num[j];
num[j] = tmp;
}
}
}
N = num[0];
for (int j = 1; j < i; j++){
N = N * 10 + num[j];
}
return N;
}
int Get_reverse(int N){
int * num = new int[];
int i = 0;
while (N>0){
num[i++] = N % 10;
N = N / 10;
}
N = num[0];
for (int j = 1; j < i; j++){
N = N * 10 + num[j];
}
return N;
}
int _tmain(int argc, _TCHAR* argv[])
{
int N;
cin >> N;
cout << N<<"->";
Hash_Table table;
for (int i = 0; i < 10; i++){
}
while (Add_HashTable(N, table)){
int max_num = Get_max(N);
int min_num = Get_reverse(max_num);
N = max_num - min_num;
cout << N << "->";
}
system("pause");
return 0;
}