6174问题
时间限制:
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
-
第一行输入n,代表有n组测试数据。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int sum = s.nextInt(); // n组数据
int[] arr = new int[sum];
int[] num = new int[sum];
for (int i = 0; i < num.length; i++) {
num[i]+=2;
}
for (int i = 0; i < sum; i++) {
arr[i] = s.nextInt();
}
for (int i = 0; i < arr.length; i++) {
int temp=0;
int temp1=0;
temp = retBig(arr[i]) - retBut(arr[i]);
while (true) {
temp1 = temp;
temp = retBig(temp) - retBut(temp);
if(temp == temp1){
break;
}
num[i]++;
}
}
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
}
public static int retBig(int a){ // 求出最高位
int[] arrSoft = new int[4]; // 转换为char数组并从大到小排序
arrSoft[0] = a/1000;
arrSoft[1] = a%1000/100;
arrSoft[2] = a%100/10;
arrSoft[3] = a%10/1;
for (int j = 1; j < 4; j++) {
for (int j2 = 0; j2 < 4 -j; j2++) {
if(arrSoft[j2]<arrSoft[j2+1]){
int temp;
temp = arrSoft[j2];
arrSoft[j2] = arrSoft[j2+1];
arrSoft[j2+1] = temp;
}
}
}
int temp = 1000; // char 数组转换为int
int num = 0;
for (int j = 0; j < arrSoft.length; j++) {
num = num + arrSoft[j]*temp;
temp = temp/10;
}
return num;
}
public static int retBut(int a){ // 求出最低位
int[] arrSoft = new int[4]; // 转换为char数组并从大到小排序
arrSoft[0] = a/1000;
arrSoft[1] = a%1000/100;
arrSoft[2] = a%100/10;
arrSoft[3] = a%10/1;
for (int j = 1; j < 4; j++) {
for (int j2 = 0; j2 < 4 -j; j2++) {
if(arrSoft[j2]>arrSoft[j2+1]){
int temp;
temp = arrSoft[j2];
arrSoft[j2] = arrSoft[j2+1];
arrSoft[j2+1] = temp;
}
}
}
int temp = 1000; // char 数组转换为int
int num = 0;
for (int j = 0; j < arrSoft.length; j++) {
num = num + arrSoft[j]*temp;
temp = temp/10;
}
return num;
}
}