- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- /*
- 关注微信有你想不到的惊喜任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:
- 65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。
- 如此往复,数字会落入某个循环圈(称为数字黑洞)。
- 比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
- 请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
- [82962, 75933, 63954, 61974]
- 其中数字的先后顺序可以不考虑。
- *
- * 思路:
- * 1.把5个数字转换为长度为5的数组。
- * 2.每个索引中的值都为0-9。
- * 3.升序和降序排列。
- * 4.将数组转换为字符串输出,然后将字符串转换为数字进行运算
- * 5.对得到的数字进行递归运算,如果5位数全部相同,则停止循环。
- * 6.将得到的数字装到list中。
- * */
- public class DigitDarkHoleDemo {
- public static void main(String[] args) {
- int x = 34256;
- digitHole(x);
- }
- /*利用递归调用,每次获取到的数字,都跟集合中已经存在的数字相比较,若想等则说明找到该循环*/
- public static void digitHole(int x){
- int temp = getNum(x);
- List<Integer> list = new ArrayList<>(10);
- boolean flag = true;
- while(flag){
- list.add(temp);
- temp=getNum(temp);
- for(int i=0;i<list.size();i++){
- if(temp == list.get(i)){
- int index = list.indexOf(temp);
- while(index>0){
- try {
- list.remove(0);
- index--;
- }catch (Exception e) {
- e.printStackTrace();
- }
- }
- flag=false;
- break;
- }
- }
- }
- System.out.println(list);
- }
- @Override
- public String toString() {//用集合来装数字黑洞中的循环圈
- String str="[";
- List<Integer> list = new ArrayList<>();
- for(int i=0;i<list.size();i++){
- if(i==list.size()-1){
- str+=list.indexOf(i);
- }else{
- str+=list.indexOf(i)+",";
- }
- }
- return str+"]";
- }
-
- public static int getNum(int num){//获得一个5位数的数字黑洞
- int[] arr = new int[5];
- int[] temparr = getArr(num);
- if(temparr.length<5){
- for(int i=0;i<5-temparr.length;i++){
- arr[i] = 0;
- }
- }
- System.arraycopy(temparr, 0, arr, arr.length-temparr.length, temparr.length);
- Arrays.sort(arr);
- int min = arr2Num(arr);//得到这个数字升序排列后的数字
- invert(arr);
- int max = arr2Num(arr);
- int temp = max-min;//得到最大值减去最小值的差,得到新的数据
- return temp;
-
- }
-
- public static int[] getArr(int x){//将得到的数变成一个数组,好进行升序与降序排列
- String str = x+"";
- char[] carr = str.toCharArray();
- int[] arr = new int[carr.length];
- for(int i=0;i<carr.length;i++){
- arr[i] = Character.getNumericValue(carr[i]);
- }
- return arr;
- }
-
- public static int arr2Num(int[] arr){//将数组变成数字
- String str = "";
- for(int i=0;i<arr.length;i++){
- str+=arr[i];
- }
- return Integer.parseInt(str);
- }
-
- public static void invert(int[] arr){//反转数组,用于将数组逆序排列
- int temp = 0;
- for(int i=0;i<arr.length/2;i++){
- temp = arr[arr.length-1-i];
- arr[arr.length-1-i] = arr[i];
- arr[i] = temp;
- }
- }
-
- }
复制代码 |