码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 57 6174问题

时间:2015-06-10 19:31:12      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:c++   acm   

啊哈!初次知道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;
}


NYOJ 57 6174问题

标签:c++   acm   

原文地址:http://blog.csdn.net/u011694809/article/details/46444563

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!