//思路简单,但细节上的处理比较多 //用char字符串来读入数字,这样处理起来会方便许多 #include<iostream> #include<cstring> #include<algorithm> using namespace std; int n,time,temp; bool same; char num1[100],num2[100],num3[100]; bool cmp(char a,char b)//降序sort比较函数 { return a > b; } int change(char num[])//将字符串转化为int { return num[0]*1000 + num[1]*100 + num[2]*10 + num[3]; } void read(int n)//读入int型转化成char字符串 { num3[0] = n/1000 + '0';//注意+'0' num3[3] = n%10 + '0'; num3[2] = n/10%10 + '0'; num3[1] = n/100%10 + '0'; int cnt = 0; while(num3[0] == '0' && cnt != 3)//处理前置0,但要保留一个0 { ++cnt; num3[0] = num3[1]; num3[1] = num3[2]; num3[2] = num3[3]; num3[3] = num3[4]; } } bool str_compare(char num[])//自定义个比较函数,如果等于0或6174跳出循环 { if(num[0] == '6' && num[1] == '1' && num[2] == '7' && num[3] == '4') return true; else if(num[0] == '0') return true; else return false; } void print(char num[])//自定义的输出函数,用于忽略字符串的前导零 { if(strlen(num) == 1 && num[0] == '0')//当剩下最终结果是0的时候 cout << num[0]; else if(num[0] == '0' && num[2] == '0' && num[3] == '0') cout << num[3]; else if(num[0] == '0' && num[1] == '0') cout << num[2] << num[3]; else if(num[0] == '0') cout << num[1] << num[2] << num[3]; else cout << num; } int main() { while(cin >> num1) { time = 0; same = 1; if(num1[0] == '-') break; cout << "N=" << num1 << ":" << endl; for(int i = 1;i < 4;++i) { if(num1[i-1] != num1[i]) same = 0; } if(strlen(num1) != 4 || same) { cout << "No!!" << endl; } else { strcpy(num2,num1); while(!str_compare(num3)) { ++time; sort(num1,num1+strlen(num1),cmp); sort(num2,num2+strlen(num2)); temp = change(num1) - change(num2);//转化成int型后相减 read(temp);//读入int型转化为字符串 print(num1);cout << "-";print(num2);cout << "=";print(num3);cout << endl; strcpy(num1,num3); strcpy(num2,num3); } cout << "Ok!! " << time << " times" << endl; memset(num3,0,sizeof(num3));//将num3清空,避免进入不了循环 } } return 0; }