假设你有一个各位数字互不相同的四位数,把所有数字从大到小排序后得到a,从小到大排序后得到b,然后用a-b替换原来这个数,并且继续操作。例如:从1234出发,依次可得到4321-1234=3087 8730-378=8352 8532-2358=6174。有趣的是 7641-1467=6174.回到了它自己.
输入一个n位数,输出操作序列,直到出现循环为止(即新得到的数曾经得到过).输入保证在循环之前最多只会产生1000个整数.
样例输入:1234
样例输出:1234->3087->8352->6174->6174
#include "stdafx.h" #include<iostream> #include<string> #include<sstream> #include<vector> using namespace std; int getMax(string inData); string get_next(string input); int getMin(string inData); int _tmain(int argc, _TCHAR* argv[]) { vector<string> inData; string input; cin>>input; string res=input; while(find(inData.begin(),inData.end(),res)==inData.end()){ inData.push_back(res); cout<<res<<"->"; res=get_next(res); } cout<<inData[inData.size()-1]<<endl; return 0; } string get_next(string input) { int max = getMax(input); int min = getMin(input); ostringstream oss; oss<<max-min; string result = oss.str(); return result; } int getMin(string inData) { string data =inData; int len = data.size(); for(int i=0;i!=len;i++) { for(int j =i+1 ;j!=len;++j) { if(data[i]>data[j]) { int temp = data[j]; data[j]=data[i]; data[i]=temp; } } } return atoi(data.c_str()); } int getMax(string inData) { string data =inData; int len = data.size(); for(int i=0;i!=len;i++) { for(int j =i+1 ;j!=len;++j) { if(data[i]<data[j]) { int temp = data[j]; data[j]=data[i]; data[i]=temp; } } } return atoi(data.c_str()); }