试题 算法训练 p0602java

编写一个程序,输入一个4位的自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后用最大数减去最小数,得到一个新的自然数,把这个数打印出来。然后对于这个新的自然数,重复上述步骤,直到该自然数的值不再发生变化。例如,假设用户输入的自然数为1001,那么由它所形成的最大数为1100,最小数为11,因此新的自然数为1089。对于1089,由它形成的最大数为9810,最小数为189,因此新的自然数为9621。9621的最大数为9621,最小数为1269,结果为8352,。8352的最大数为8532,最小数为2358,结果为6174。6174的最大数为7641,最小数为1467,结果仍为6174,因此程序结束。
输入:
1001
输出:
6174

我看到这道题目,想到的便是递归,下边是我实现题目要求的具体思想:
首先写一个方法把输入的四位数进行重新组合,算出组合后最大值和最小值的差值(这里用min表示的),因为以后每个步骤都是重复的,进而直接进行递归,当差值等于原来的值时,输出这个值。

因为本人还只是编程届的新手,解题思路难免low了点,欢迎大佬在评论区谈谈更好的解题方法。

以下是具体代码:
import java.util.Arrays;
import java.util.Scanner;

public class Main {
public static void main(String[]args) {
Scanner sca=new Scanner(System.in);
int n=sca.nextInt();
int a=min(n);
while(min(a)!=a) {
a=min(a);
}
System.out.println(a);
}
public static int min(int n) {
int min=0;
int a=n/1000%10;
int b=n/100%10;
int c=n/10%10;
int d=n%10;
int []A=new int[4];
A[0]=a;A[1]=b;A[2]=c;A[3]=d;
Arrays.sort(A);
int p=A[3]*1000+A[2]*100+A[1]*10+A[0];
int q=A[0]*1000+A[1]*100+A[2]*10+A[3];
min=p-q;
return min;
}
}


版权声明:本文为m0_58829450原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。