南阳OJ--题目57:6174问题

题目网站链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=57&rec=rec  6174问题

题目相关资料查询:6174数字黑洞

题目信息:

描述

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

解题思路:

      第一次提交的时候,答案错误,分析了一下,是一些特殊的数据没有考虑到。
      仔细审题,题目要求是四个数字要完全不相同,查阅资料,6174数字黑洞要求四个数字不能完全相同,但是可以存在4个以下下同的数字(虽然题目给出的数据会避免这一点,我还是废话了一下,加深自己的印象)。
然后,关键问题是我在处理数据的时候,排序后数max-min,可能得到的数并不是4位数,这时候,再进行递归,数字的处理会出现问题。
这是因为此时传入的数字不再是4位数,可能是 两位数,所以我们可以在数字传入的时候,对其进行一个4为的检测和处理。
       好了,接着不废话了,接下来让我们来理清这道题的思路:
        这道题主要要实现的功能是传入的一个4位数number,经过变化成value之后
       检查是否和自己相等      (1)
       如果,number==value,就结束,输出变化的次数    (2)
       如果不相等,就将number=value,value=GetSameNumber(number); count++;   转到(1)
以上是数字大致的一个处理过成功,然后就是数字变化的一个处理:
函数GetSameNumber(key)是对传入数字一个变化处理,返回max-min后的数字,这里要注意检测传入的key是否是4位数。
       最后测试结果~
       

代码实现:

import java.util.Arrays;
import java.util.Scanner;

/*
 * 2017/4/20
 * Dragon
 * 6174问题:http://acm.nyist.net/JudgeOnline/problem.php?pid=57&rec=rec
 */
public class Num_57 {

	private static int count=1;
	public static void main(String[] args)
	{
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		int[] result=new int[n];
		for(int m=0;m<n;m++)
		{
			int input=in.nextInt();
		
			int value=GetSameNumber(input);
			while(value!=input)
			{
				count++;
				input=value;
				value=GetSameNumber(input);
			}
			result[m]=count;
			count=1;
		}
		
		for(int i=0;i<n;i++)
			System.out.println(result[i]);
	}
	
	private static int GetSameNumber(int input) 
	{
		String inputString=String.valueOf(input);
		int[] number=new int[4];
			  //不足四位数的情况,对数字补0
		if(input%1000<1)
		{
			int valueLen=inputString.length();
			int insertCount=4-valueLen;
			for(int i=0;i<insertCount;i++)
				number[i]=0;
			for(int i=insertCount;i<4;i++)
				number[i]=inputString.charAt(i);
		}
		else
			for(int i=0;i<4;i++)
				number[i]=inputString.charAt(i);
			
		Arrays.sort(number);
		int max=number[3]*1000+number[2]*100+number[1]*10+number[0];
		int min=number[0]*1000+number[1]*100+number[2]*10+number[3];
		int value=max-min;
		
		return value;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值