6174问题
时间限制:1000 ms | 内存限制:65535 KB
难度:2
输入
第一行输入n,代表有n组测试数据。
接下来n行每行都写一个各位数字互不相同的四位数
输出
经过多少次上面描述的操作才能出现循环
样例输入
1
1234
样例输出
4
描述
假设你有一个各位数字互不相同的四位数,把所有的数字从大到小排序后得到a,从小到大后得到b,然后用a-b替换原来这个数,并且继续操作。例如,从1234出发,依次可以得到4321-1234=3087、8730-378=8352、8532-2358=6174,又回到了它自己!现在要你写一个程序来判断一个四位数经过多少次这样的操作能出现循环,并且求出操作的次数
比如输入1234执行顺序是1234->3087->8352->6174->6174,输出是4
个人解答:
本来是用(m-1000*a)/100这种方式求数据的每个数字的,后来在发现先求模再除更快http://blog.csdn.net/shizhixin/article/details/7538748。
程序运行时间也由原来的204变为24,暂时还没想到哪里可以优化/(ㄒoㄒ)/~~
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int caseCount = input.nextInt();
int m, count, a, b, c, d;
List list = new ArrayList();
while (caseCount-- > 0) {
m = input.nextInt();
count = 0;
while (true) {
a = m / 1000; //千位
b = m / 100 % 10; //百位
c = m / 10 % 10; //十位
d = m % 10; //个位
int arr[] = {a,b,c,d};
Arrays.sort(arr); //升序
m = arr[3]*1000+arr[2]*100+arr[1]*10+arr[0] - (arr[0]*1000+arr[1]*100+arr[2]*10+arr[3]);
if (m != 6174) {
count ++;
}else {
break;
}
}
list.add(count + 2); //参考示例,到6174时加2
}
for (int i : list) {
System.out.println(i);
}
}
}
运行结果: