蓝桥杯: P0602数字排列
编写一个程序,输入一个4位的自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后用最大数减去最小数,得到一个新的自然数,把这个数打印出来。然后对于这个新的自然数,重复上述步骤,直到该自然数的值不再发生变化。例如,假设用户输入的自然数为1001,那么由它所形成的最大数为1100,最小数为11,因此新的自然数为1089。对于1089,由它形成的最大数为9810,最小数为189,因此新的自然数为9621。9621的最大数为9621,最小数为1269,结果为8352,。8352的最大数为8532,最小数为2358,结果为6174。6174的最大数为7641,最小数为1467,结果仍为6174,因此程序结束。
输入:
1001
输出:
6174
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int []ints=new int[4];
int input1=input.nextInt();
ints[0]=input1/1000;
ints[1]=input1%1000/100;
ints[2]=input1%1000%100/10;
ints[3]=input1%1000%100%10;
combine(ints);
}
public static void combine(int []ints){
Integer result=ascSort(ints)-descSort(ints);//第一次结果
int []num=new int[4];
StringBuffer stringBuffer=new StringBuffer();
int i=0;
while (true){
stringBuffer.append(result);//存储结果
stringBuffer.append(" ");//添加空格,方便切割成数组
//分解成个,十,百,千,方便排序
num[0]=result/1000;
num[1]=result%1000/100;
num[2]=result%1000%100/10;
num[3]=result%1000%100%10;
result=ascSort(num)-descSort(num);
String[]s=stringBuffer.toString().split(" ");//切割成数组
//数组只有一个的时候不触发该循环体的if循环
for (int j=0 ;j<s.length;j++){
//和前一个相比,相同输出
if (j>=1&&s[i].equals(s[j-1])){//j>=1 使第一次不参与比较,防止数组越界
System.out.println(s[i]);//取第i个
return;
}
}
i++;
}
}
//降序排序
public static Integer ascSort(int []ints){
for (int i=0;i<ints.length-1;i++){
for (int j=0;j<ints.length-i-1;j++){
if (ints[j]<ints[j+1]){
int tem =ints[j];
ints[j]=ints[j+1];
ints[j+1]=tem;
}
}
}
Integer max= Integer.parseInt(outPut(ints).toString());
return max;
}
//升序排序
public static Integer descSort(int [] ints){
for (int i=0;i<ints.length-1;i++){
for (int j=0;j<ints.length-i-1;j++){
if (ints[j]>ints[j+1]){
int tem =ints[j];
ints[j]=ints[j+1];
ints[j+1]=tem;
}
}
}
Integer min=Integer.parseInt(outPut(ints).toString());
return min;
}
//输出
public static StringBuffer outPut(int [] ints){
StringBuffer stringBuffer=new StringBuffer();
for (int a:ints){
stringBuffer.append(a);
}
return stringBuffer;
}
}