题目网站链接: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; } }
-