异想天开

What's the true meaning of light, Could you tell me why

6174问题

日期:2015-06-05 17:51:35
  
最后更新日期:2015-06-05 17:56:42
描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数

比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4

输入
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数
输出
经过多少次上面描述的操作才能出现循环
样例输入
1
1234
样例输出
4
解:
学习使用c++
[code lang="cpp"]
#include<cstdio>
#include<cstdlib>
#include<vector>
#include <functional>
#include<algorithm>
using namespace std;

class Number{
public:
explicit Number(int n){
for (; n!=0; n=n/10){
int m=n%10;
try{
m_vec.push_back(m);
}
catch (...){
}
}
}
operator int () const
{
return value();
}
int bigorder(){
sort(m_vec.begin(),m_vec.end(),greater<int>());
return value();
}
int smallorder(){
sort(m_vec.begin(),m_vec.end(),less<int>());
return value();
}
private:
int value() const
{
int n=0;
for (vector<int>::const_iterator iter=m_vec.begin(); iter!=m_vec.end(); ++iter){
n = 10*n+*iter;
}
return n;
}
vector<int> m_vec;
};

int solve(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);

int times=0;
while (n!=6174){
Number v(n);
n=v.bigorder()-v.smallorder();
times++;
}
printf("%d\n",times+1);
}
return 0;
}

int main()
{
solve();
return 0;
}
[/code]