您的位置:首页 > 编程语言 > C语言/C++

NYOJ 57 6174问题

2015-06-10 17:33 627 查看
啊哈!初次知道6174,还是在高中时,一本科普书上讲的。作为回忆,就把这道题AC了。

水题,不过去掉下面的注释,可以很直观的看到过程。

最后!!!为什么我用memset函数总是忘写#include<cstring>头文件!!!

时间限制:1000 ms  |  内存限制:65535 KB
难度:2

描述

假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到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


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int ans[4];

bool cmp(int lhs, int rhs)
{
return lhs>rhs;
}

int mysort(int x,int s)
{
int i,j;
memset(ans,0,sizeof(ans));
for(i=0,j=10000;i<4;i++)
{
j/=10;
ans[i]=x/j%10;
}

if(s)
sort(ans,ans+4,cmp);
else
sort(ans,ans+4);
/*

for(i=0;i<4;i++)
cout<<ans[i]<<" ";
cout<<endl;

*/
x=0;
for(i=0,j=10000;i<4;i++)
{
j/=10;
x+=ans[i]*j;
}

return x;
}

int main()
{
int n,m,lhs,rhs,tmd;
cin>>n;
while(n--)
{
cin>>m;
tmd=1;
while(m!=6174)
{
lhs=mysort(m,0); //升序
rhs=mysort(m,1); //降序
m=rhs-lhs;
++tmd;
}
cout<<tmd<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ acm