您的位置:首页 > 编程语言 > Java开发

NYOJ-57 6174问题

2017-03-16 00:00 148 查看
摘要: 原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=57

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<Integer> list = new ArrayList<Integer>();
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);
}
}
}

运行结果:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java oj 6174